c# – EF Core,投影子集合渴望加载

c# – EF Core,投影子集合渴望加载,第1张

概述在EF核心中,我试图用子集合来计划结果集. ctx.As.Select(a => new { AId = a.Id, BNames = a.Bs.Select(x=>x.Name) //SubCollection }) 但是,当执行此 *** 作时,BNames集合是惰性的,因此当它被枚举时,它会触发每行的单独查询.例如,对于B集合中的2个项目. [a].[ 在EF核心中,我试图用子集合来计划结果集.
ctx.As.Select(a => new    {        AID = a.ID,Bnames = a.Bs.Select(x=>x.name) //SubCollection    })

但是,当执行此 *** 作时,Bnames集合是惰性的,因此当它被枚举时,它会触发每行的单独查询.例如,对于B集合中的2个项目.

[a].[ID] AS [AID] FROM [As] AS [a]p_executesql N'SELECT [x].[name]FROM [Bs] AS [x]WHERE @_outer_ID = [x].[AID]',N'@_outer_ID int',@_outer_ID=1p_executesql N'SELECT [x].[name]FROM [Bs] AS [x]WHERE @_outer_ID = [x].[AID]',@_outer_ID=2

在EF6中,相同的查询会产生以下结果(正如我所料):

SELECT [Extent1].[ID] AS [ID],[Project1].[C1] AS [C1],[Project1].[name] AS [name]FROM  [dbo].[A] AS [Extent1]left OUTER JOIN  (SELECT     [Extent2].[name] AS [name],[Extent2].[A_ID] AS [A_ID],1 AS [C1]    FROM [dbo].[B] AS [Extent2] ) AS [Project1] ON [Extent1].[ID] = [Project1].[A_ID]ORDER BY [Extent1].[ID] ASC,[Project1].[C1] ASC

如何让EF热切地加载子集合Bname?

注意:这与包含.Include的子实体不同,因为这是自定义投影,而不是导航属性.在此处使用.Include会导致错误.

完整的回购代码:https://gist.github.com/lukemcgregor/692834629da09b21d5a35515e86c9002

解决方法 这在EF Core 2.1中可以使用其相关的子查询优化.

您需要更新到EF Core 2.1并进行小修改以通过向子查询添加.ToList()来选择优化:

foreach (var thing in ctx.As    .Select(a => new    {        AID = a.ID,Bnames = a.Bs.Select(x => x.name).ToList()    }))

见New features in EF Core 2.1中的Optimization of correlated subqueries.

总结

以上是内存溢出为你收集整理的c# – EF Core,投影子集合渴望加载全部内容,希望文章能够帮你解决c# – EF Core,投影子集合渴望加载所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/langs/1243334.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存