Entity Framework Core急切加载Then Include集合

49

我有三个模型,希望在查询时包含它们。

这是场景:

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中用于为集合中的每个项目加载User的代码。

_dbContext.Sale.Include(s => s.SaleNotes).ThenInclude(...);
2个回答

66

无论 SaleNotes 是集合导航属性还是参考导航属性,都不会影响其工作方式:

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

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

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

52
感谢您的回答。实际上我发现,尽管“User”没有出现在Intellisense中,但是我添加了“sn.User”,构建我的解决方案并运行了它!Intellisense将lambda表达式中的“SaleNotes”“sn”视为集合,因此不显示“User”类的各个属性。 - Allen Rufolo
8
@AllenRufolo,这里有两个重载函数,第一个(也是默认的)会返回整个列表,第二个则会返回列表中的每一项。因此,如果你在Intellisense中只按“向下箭头”,你就会看到期望的智能提示选项。我之前也有同样的困惑 :-) - gzak
3
Allen,你说得完全正确。我正在使用VS 2017 15.4上的EF Core 2.0,但智能提示功能不起作用,但如果你只是键入所需的属性名称,它就可以正常工作。这对我帮助很大。 - paultechguy
2
@AllenRufolo 感谢您关于 IntelliSense 未显示的评论。这是个疯狂的 bug!您为我节省了很多精力!我永远不会想到 IntelliSense 在这里可能不起作用。 - Arkadiusz Kałkus
1
@AllenRufolo 我希望他们会解决这个问题。我今天提交了一个bug,它很棘手 :). - Arkadiusz Kałkus
显示剩余6条评论

4

仅供参考,目前最新版本的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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接