热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何通过GroupJoin使EFeager加载集合导航属性?

如何解决《如何通过GroupJoin使EFeager加载集合导航属性?》经验,为你挑选了1个好方法。

我正在尝试使用GroupJoin一些数据IQueryable并将数据投影为匿名类型.我所在的原始实体GroupJoin具有ICollection导航属性(即一个:多个).我想急切加载该属性,以便我可以在组加入后访问它而不用EF返回到数据库.我知道Include()当你使用a时它不起作用GroupJoin,但是下面的代码是我发现的唯一方法,使它急于加载collection(ContactRoomRoles):

using (var cOntext= new MyDbContext()) {
    var foundRooms = context.Rooms.Include(rm => rm.ContactRoomRoles);
    foundRooms.ToList();  // <-- Required to make EF actually load ContactRoomRoles data!

    var roomsData = foundRooms
        .GroupJoin(
            context.Contacts,
            rm => rm.CreatedBy,
            cOnt=> cont.Id,
            (rm, createdBy) => new {
                COntactRoomRoles= rm.ContactRoomRoles,
                Room = rm,
                CreatedBy = createdBy.FirstOrDefault()
            }
        )
        .ToList();

    var numberOfRoles1 = roomsData.ElementAt(1).Room.ContactRoomRoles.Count();
    var numberOfRoles2 = roomsData.ElementAt(2).Room.ContactRoomRoles.Count();
    var numberOfRoles3 = roomsData.ElementAt(3).Room.ContactRoomRoles.Count();
}

如果我删除了foundRooms.ToList(),EF会在数据库中进行3次以填充我的numberOfRoles变量,但foundRooms.ToList()事实并非如此 - 它只是急于在一个查询中预先加载数据.

虽然这有效,但感觉就像完全黑客.我只是要求.ToList()让EF实际加载收集数据的副作用.如果我评论该行,它会在我尝试访问时进入数据库ContactRoomRoles.是否有一种不太常见的方式使EF eager加载导航属性?

注意:我想使用导航属性而不是将其投影到匿名类型的新属性中,因为AutoMapper Room.ContactRoomRoles在映射到DTO对象时想要访问它.



1> Roman Pokrov..:

这不是一个黑客.这是一个抽象泄漏.我们应该准备好使用ORM工具(以及任何其他内部DSL)来解决抽象泄漏问题.

ToList()你不仅执行实际的sql调用(并将数据加载到内存中)之后,还要交叉到其他Linq风格 - "Linq for objects".在此之后所有的调用Count()都不会因为你开始使用内存集合而生成sql(而不是表达式树被隐藏的IQueryable- GroupBy语句的返回类型,但带有List集合 - 返回类型的ToList).

如果没有ToList()你留下"Linq for sql",EF会将Count()IQuerybale上的每次调用转换成sql; 三个Conut()调用=三个带下划线的Sql语句.

没有办法避免这种情况,否则count(*)在一个复杂查询中计算服务器端的所有值.如果您将尝试使用Linq(构建expression tree)编写此类查询- 您将再次遇到抽象泄漏.ORM工具旨在将对象映射到"RDBS实体",保持CRUD(创建读取更新删除)操作 - 如果语句变得更复杂 - 您将无法预见生成的sql(以及所有运行时异常,如'无法生成sql对于这样的linq').因此,不要将linq用于复杂的"报告",例如"查询"(在某些情况下,您可以 - 这取决于您的重复使用要求和测试可能性).使用旧的好SQL并通过ADO或EF ADO"sql扩展"调用它,如EF Core FromSql:

var blogs = context.Blogs
    .FromSql("EXECUTE dbo.GetMostPopularBlogsForUser {0}", user)
    .ToList();

更新:如果您不使用可重复使用的EF工具,建议您避免使用延迟加载和手动实体加载.它们在某种意义上与linq查询相反 - 表达式树.它们是重要的(如果不是只有一个)选项,用于在"旧"平台上加载引用的实体,其中语言中没有"表达式树",但在.NET/EF中,完整查询可以"声明方式"写为表达式树而不执行(但推迟解释)应该有非常强烈的理由返回"手动"加载.


推荐阅读
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了在使用Laravel和sqlsrv连接到SQL Server 2016时,如何在插入查询中使用输出子句,并返回所需的值。同时讨论了使用CreatedOn字段返回最近创建的行的解决方法以及使用Eloquent模型创建后,值正确插入数据库但没有返回uniqueidentifier字段的问题。最后给出了一个示例代码。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • Postgresql备份和恢复的方法及命令行操作步骤
    本文介绍了使用Postgresql进行备份和恢复的方法及命令行操作步骤。通过使用pg_dump命令进行备份,pg_restore命令进行恢复,并设置-h localhost选项,可以完成数据的备份和恢复操作。此外,本文还提供了参考链接以获取更多详细信息。 ... [详细]
author-avatar
涵宝宝201503
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有