是加载孙辈属性的首选方法之一吗?我喜欢第一种方法的简洁性,但是我不知道它是否更昂贵。
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);
答案 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上提问。