EF LINQ包括多个和嵌套实体(EF LINQ include multiple and nest

2019-08-19 01:14发布

好吧,我有以下层次三层次的实体:课程 - >模块 - >第二章

这里是原来的EF LINQ语句:

Course course = db.Courses
                .Include(i => i.Modules.Select(s => s.Chapters))
                .Single(x => x.Id == id); 

现在,我想包括所谓的实验室的另一个实体,与课程相关的。

如何包括实验室实体?

我尝试以下,但它没有工作:

Course course = db.Courses
                .Include(i => i.Modules.Select(s => s.Chapters) && i.Lab)
                .Single(x => x.Id == id); 

在包括第二实体的任何想法?

任何一块提醒或信息将高度赞赏。 谢谢!

Answer 1:

您是否尝试只需添加另一个Include

Course course = db.Courses
                .Include(i => i.Modules.Select(s => s.Chapters))
                .Include(i => i.Lab)
                .Single(x => x.Id == id);

因为您的解决方案失败, Include不采取布尔逻辑运算符

Include(i => i.Modules.Select(s => s.Chapters) &&          i.Lab)
                           ^^^                  ^             ^ 
                          list           bool operator    other list

更新要了解更多信息,请下载LinqPad并通过样品的样子。 我认为这是熟悉的LINQ和Lambda的最快方式。

作为一个开始-之间的区别Select ,并Include是与一个选择,你决定要返回(又名投影) 的东西 。 在include是一个预先加载的功能,告诉你希望它包括来自其他表中的数据实体框架。

在包括语法,也可以在字符串。 像这样:

           db.Courses
            .Include("Module.Chapter")
            .Include("Lab")
            .Single(x => x.Id == id);

但在样品LinqPad解释这更好的。



Answer 2:

Include精通接口的一部分,所以你可以写多个Include陈述每个以下其他

 db.Courses.Include(i => i.Modules.Select(s => s.Chapters))
           .Include(i => i.Lab)
           .Single(x => x.Id == id); 


Answer 3:

您也可以尝试

db.Courses.Include("Modules.Chapters").Single(c => c.Id == id);


Answer 4:

在实体框架核心( EF.core ),可以使用.ThenInclude为包括下一个水平。

var blogs = context.Blogs
    .Include(blog => blog.Posts)
        .ThenInclude(post => post.Author)
    .ToList();

更多信息: https://docs.microsoft.com/en-us/ef/core/querying/related-data

注意:假设您需要多个ThenInclude()blog.Posts ,重复刚才的Include(blog => blog.Posts)做一套ThenInclude(post => post.Other)

var blogs = context.Blogs
    .Include(blog => blog.Posts)
        .ThenInclude(post => post.Author)
    .Include(blog => blog.Posts)
        .ThenInclude(post => post.Other)
 .ToList();


Answer 5:

有人可能会这样写一个扩展方法:

    /// <summary>
    /// Includes an array of navigation properties for the specified query 
    /// </summary>
    /// <typeparam name="T">The type of the entity</typeparam>
    /// <param name="query">The query to include navigation properties for that</param>
    /// <param name="navProperties">The array of navigation properties to include</param>
    /// <returns></returns>
    public static IQueryable<T> Include<T>(this IQueryable<T> query, params string[] navProperties)
        where T : class
    {
        foreach (var navProperty in navProperties)
            query = query.Include(navProperty);

        return query;
    }

甚至在一个通用的实现中使用这样的:

string[] includedNavigationProperties = new string[] { "NavProp1.SubNavProp", "NavProp2" };

var query = context.Set<T>()
.Include(includedNavigationProperties);


文章来源: EF LINQ include multiple and nested entities