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

Not*_*ple 7 c# entity-framework .net-core ef-core-2.0

在EF核心中,我试图用子集合来计划结果集.

 ctx.As.Select(a => new
    {
        AId = a.Id,
        BNames = a.Bs.Select(x=>x.Name) //SubCollection
    })
Run Code Online (Sandbox Code Playgroud)

但是当执行此操作时,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=1

p_executesql N'SELECT [x].[Name]
FROM [Bs] AS [x]
WHERE @_outer_Id = [x].[AId]',N'@_outer_Id int',@_outer_Id=2
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

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


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

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

Mar*_*ich 5

这在 EF Core 2.1 中使用其相关子查询优化是可能的。

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

foreach (var thing in ctx.As
    .Select(a => new
    {
        AId = a.Id,
        BNames = a.Bs.Select(x => x.Name).ToList()
    }))
Run Code Online (Sandbox Code Playgroud)

请参阅EF Core 2.1中的新功能中的相关子查询优化