C# EF7投影不立即加载集合

C# EF7投影不立即加载集合,c#,asp.net,entity-framework,C#,Asp.net,Entity Framework,选择包含“include”的实体时,所有my项都将使用单个SQL join语句获取。但当我将其投影到其他表单及其子表单时,将不再执行联接,而是每行执行一个单独的查询以获取子表单。我怎样才能防止这种情况?我的目标是减少获取的列,并减少查询量 这个问题让我相信这应该是可行的: 你的问题是: Children = p.Children.Select(c => new { Id = c.Id, Name = c.Name }) eager loading语

选择包含“include”的实体时,所有my项都将使用单个SQL join语句获取。但当我将其投影到其他表单及其子表单时,将不再执行联接,而是每行执行一个单独的查询以获取子表单。我怎样才能防止这种情况?我的目标是减少获取的列,并减少查询量

这个问题让我相信这应该是可行的:

你的问题是:

Children = p.Children.Select(c => new {
        Id = c.Id,
        Name = c.Name
    })
eager loading语句
Include()
仅适用于不带投影的请求

除此之外,您可以执行以下操作:

context.Parents.Include(p => p.Children).AsEnumerable()
.Select(p => new {
    Id = p.Id,
    Name = p.Name,
    Children = p.Children.Select(c => new {
        Id = c.Id,
        Name = c.Name
    })
}).ToList();

AsEnumerable()对EF说,它之后的所有代码都应该在对象上执行,不应该传输到sql请求。

您看到多个查询被发送到数据库,因为EF Core还没有足够的智能将投影中的导航转换为联接。以下是跟踪此功能的问题-


顺便说一句,正如其他人之前提到的,仅当实体类型是结果的一部分时,“包含”才起作用(即,它意味着“如果您最终创建实体类型的实例,请确保填充此导航属性”)。

对于EFCore 2.0.0-preview2(目前不在nuget上),这是部分修复的

如果集合导航为 未在上合成,我们重用include管道,它创建2个查询, 而不是N+1。但是,如果对集合进行了筛选,我们仍然使用 正在发出旧的重写和N+1查询


我不知道在上组合的
在这里的确切含义,也不知道它是否仅仅意味着不能过滤
子对象
对象(可能在大多数情况下都可以接受),但我的猜测是,您原来的查询现在肯定可以工作了

我提供给github的链接没有说明它实际上应该与include+projections一起工作吗?我不知道如何解释它。虽然您的解决方案将查询数量减少到两个,但它确实会获取所有相关实体的所有列。(因此,预测是正确的,但传输了大量数据)感谢您的回复,以及所有关于EF的精彩工作!这是否意味着我的投影中的子实体最终必须是“完整”的子实体?换言之:在执行一个查询且传输的数据不超过投影需要(在我的原始问题中)的情况下,是否存在或是否存在任何解决方案?受让人:未分配任何人。已于2015年12月8日<代码>打开。好的,我现在正式结束了EFCore。我知道这是一个巨大的项目,但我无法再证明使用它的合理性,因为这样的功能仍然不存在:-(我发现了一个关于投影的好的channel9视频,但他们之间的关系是1-1的,所以围绕着这个问题。我的问题是,我的主要实体代表一封带有完整html正文的电子邮件-所以加载所有内容都是不可能的:-(我可能可以将视图用作假表并加载完整的实体。感谢您继续关注此问题。对于其他读者:这里有一个关于如何通过一个查询投影包含的示例进行讨论:
context.Parents.Include(p => p.Children).AsEnumerable()
.Select(p => new {
    Id = p.Id,
    Name = p.Name,
    Children = p.Children.Select(c => new {
        Id = c.Id,
        Name = c.Name
    })
}).ToList();