Entity Framework Core Eager Loading 然后包含在集合中

Posted

技术标签:

【中文标题】Entity Framework Core Eager Loading 然后包含在集合中【英文标题】:Entity Framework Core Eager Loading Then Include on a collection 【发布时间】:2016-10-28 21:45:08 【问题描述】:

在执行查询时,我想包含三个模型。

这里是场景。

public class Sale

     public int Id  get; set; 
     public List<SaleNote> SaleNotes  get; set; 


public class SaleNote

    public int Id  get; set; 
    public User User  get; set; 


public class User 

    public int Id  get; set; 

我可以像这样急切地加载 SaleNotes...

_dbContext.Sale.Include(s => s.SaleNotes);

但是,尝试使用 ThenInclude 从 SaleNote 中预加载 User 模型具有挑战性,因为它是一个集合。我找不到任何关于如何急切加载此场景的示例。有人可以提供以下 ThenInclude 中的代码来为集合中的每个项目加载用户。

_dbContext.Sale.Include(s => s.SaleNotes).ThenInclude(...);

【问题讨论】:

【参考方案1】:

SaleNotes 是集合导航属性并不重要。它应该对引用和集合起作用:

_dbContext.Sale.Include(s => s.SaleNotes).ThenInclude(sn=>sn.User);

但据我所知,EF7 还支持使用 Select 扩展方法的旧的多级 Include 语法:

_dbContext.Sale.Include(s => s.SaleNotes.Select(sn=>sn.User));

【讨论】:

感谢您的回答。我实际上发现虽然用户没有出现在智能感知中,但我添加了 sn.User,构建了我的解决方案,它运行了!智能感知将 lambda 表达式中的 SaleNotes“sn”视为一个集合,因此它没有显示 User 类的各个属性。 @AllenRufolo 有两个重载,一个为您提供整个列表(第一个和默认值),另一个为您提供列表中的每个项目(第二个) - 所以,如果你只是在智能感知中执行“向下箭头”,您将看到预期的智能感知选项。我自己也有同样的困惑:-) 艾伦,你是绝对正确的。我在 VS 2017 15.4 上使用 EF Core 2.0 并且 intelliesense 无法正常工作,但如果您只输入所需的属性名称,就可以了。这帮了我很多忙。 @AllenRufolo 感谢您对未在智能感知中显示的评论。这是疯狂的错误!你为我节省了很多精力!我永远不会猜到智能感知在这里可能不起作用。 @AllenRufolo 我希望他们能做到。我今天提交了一个错误。这是讨厌的一个:)。【参考方案2】:

作为参考,最新版本(发布时)EF Core 1.1.0 也支持此场景的显式加载。像这样的……

using (var _dbContext = new DbContext())

    var sale = _dbContext.Sale
        .Single(s => s.Id == 1);

    _dbContext.Entry(sale)
        .Collection(n => n.SalesNotes)
        .Load();
  
    _dbContext.Entry(sale)
        .Reference(u => u.User)
        .Load();

【讨论】:

以上是关于Entity Framework Core Eager Loading 然后包含在集合中的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework Core 快速开始

EF6 System.Data.Entity.Core.EntityKey 在 Entity Framework Core 中的等价物是啥?

张高兴的 Entity Framework Core 即学即用:创建第一个 EF Core 应用

Entity Framework Core 迁移命令

Entity Framework Core - 计算字段排序

Entity Framework Core 性能优化