EF核心中的孙子属性的Include vs.那么Include

时间:2019-10-15 12:17:21

标签: linq entity-framework-core ef-core-2.2

是加载孙辈属性的首选方法之一吗?我喜欢第一种方法的简洁性,但是我不知道它是否更昂贵。

return source
    .Include(x => x.Server)
    .Include(x => x.Server.User)
    .Include(x => x.Server.ParentServer)
    .Include(x => x.Server.DataCenter);

return source
    .Include(x => x.Server)
        .ThenInclude(s => s.User)
    .Include(x => x.Server)
        .ThenInclude(s => s.ParentServer)
    .Include(x => x.Server)
        .ThenInclude(s => s.DataCenter);

2 个答案:

答案 0 :(得分:3)

它们是等效的。第一个显然是首选,但是使用集合导航是不可能的。因此,ThenInclude()。

// Won't compile
return source
    .Include(x => x.Posts.Authors)
    .Include(x => x.Posts.Comments);

// Compiles
return source
    .Include(x => x.Posts)
        .ThenInclude(x => x.Authors)
    .Include(x => x.Posts)
        .ThenInclude(x => x.Comments);

但是,如果您想放弃编译时类型的安全性,也可以只使用字符串重载。

// Compiles, may throw
return source
    .Include("Posts.Authors")
    .Include("Posts.Comments");

但是请不要这样做...

// Over-thinking it ;-)
return source
    .Include(nameof(Blog.Posts) + "." + nameof(Post.Authors))
    .Include(nameof(Blog.Posts) + "." + nameof(Post.Comments));

答案 1 :(得分:1)

这是一个非常有趣的问题!如果使用EF(核心)文档,则完全没有记录这一点。

几周前,我对此进行了一些测试,得出的结论是这些方法之间没有区别。

我尝试了数十种方案,从最简单,最愚蠢的方案到8级关系层次结构,生成的SQL请求始终 100%相同

然后,我看了一下EF Core的源代码,发现Include()ThenInclude()实现之间没有真正的区别。

所以我的回答不是100%肯定,也许我遗漏了一些东西,但是,我认为这两种方法是相同的。

如果您想确定的答案,我认为最好的方法是在EF Core's repo上提问。