如何在 Linq 查询中多次包含一个表
Posted
技术标签:
【中文标题】如何在 Linq 查询中多次包含一个表【英文标题】:How to include a table multiple times in Linq query 【发布时间】:2021-12-03 00:48:16 【问题描述】:这是我的查询,使用 EntityFramework 6.0
var x = context.Student
.Include(d => d.Class.Select(di => di.Teachers).Select(i => i.Subjects))
.Include(d => d.Class.Select(di => di.Teachers).Select(di => di.Marks))
.firstOrDefault();
实体 Subject 和 Class 是 Teachers 实体的子实体。如何在一个查询中包含两个子实体? 执行查询时,Teachers 实体会被加载两次吗? 由于 'class' 表被包含两次,所以生成 SQL 时是否会加入 'class' 表 2 次?
【问题讨论】:
在 sql profiler 中检查了生成的查询,它没有两次加入表。所以 Include 不会创建重复的连接 【参考方案1】:您使用的是 EF6 还是 EF Core?在 EF Core 上,您可以使用 ThenInclude 加载更深层次的实体。喜欢(来自 MS Docs):
using (var context = new BloggingContext())
var blogs = context.Blogs
.Include(blog => blog.Posts)
.ThenInclude(post => post.Author)
.ThenInclude(author => author.Photo)
.Include(blog => blog.Owner)
.ThenInclude(owner => owner.Photo)
.ToList();
【讨论】:
EF 6.0 那你做的很对。不用担心重复连接。提供者应该足够聪明,不会那样做。来自 MS Docs 的示例:docs.microsoft.com/en-us/ef/ef6/querying/… 如上所述,不用担心重复。Include
只是指令加载什么,存在去重逻辑。以上是关于如何在 Linq 查询中多次包含一个表的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Linq EntityFramework 4 中使用内连接和除外