如何在 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 根据用户属于另一个表的位置来查询表

如何使用 LINQ 和变量动态查询数据库?

如何使用LINQ返回多个自选字段

如何在 Linq EntityFramework 4 中使用内连接和除外

在 Entity Framework Core 中,如何使用数据库级别的条件(不是本地 LINQ)查询连接表上的数据?

如何在视图模型中存储 linq 查询结果