[.net] EF LINQ는 여러 개의 중첩 된 엔티티를 포함합니다.

좋아, 나는 다음과 같은 계층 구조를 가진 트라이 레벨 엔티티를 가지고 있습니다 : Course-> Module-> Chapter

원래 EF LINQ 문은 다음과 같습니다.

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

이제 코스와 관련된 Lab이라는 다른 엔터티를 포함하고 싶습니다.

랩 엔티티를 포함 시키려면 어떻게합니까?

다음을 시도했지만 작동하지 않았습니다.

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

두 번째 엔터티 포함에 대한 아이디어가 있습니까?

모든 조언이나 정보는 높이 평가 될 것입니다. 감사!



답변

당신은 또 다른 추가 시도했다 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에 익숙해지는 가장 빠른 방법이라고 생각합니다.

시작으로 – 차이 사이에 SelectInclude있음이 선택으로 당신이 결정하는 것입니다 무엇을 당신이 (프로젝션 일명) 반환 할. 포함은 Eager 로딩 기능으로, Entity Framework에서 다른 테이블의 데이터를 포함하도록 지시합니다.

Include 구문은 문자열에있을 수도 있습니다. 이처럼 :

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

그러나 LinqPad 의 샘플은 이것을 더 잘 설명합니다.


답변

Entity Framework Core ( 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();


답변

Include유창한 인터페이스의 일부이므로 Include서로를 따라 여러 문장을 작성할 수 있습니다.

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


답변

시도해 볼 수도 있습니다

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


답변

다음과 같은 확장 메소드를 작성할 수 있습니다.

    /// <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);


답변