좋아, 나는 다음과 같은 계층 구조를 가진 트라이 레벨 엔티티를 가지고 있습니다 : 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에 익숙해지는 가장 빠른 방법이라고 생각합니다.
시작으로 – 차이 사이에 Select
와 Include
있음이 선택으로 당신이 결정하는 것입니다 무엇을 당신이 (프로젝션 일명) 반환 할. 포함은 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);