LINQ2SQL과 함께로드 된 관련 테이블의 레코드는 언제입니까?
-
21-08-2019 - |
문제
두 개의 테이블이 있다고 가정 해 봅시다.
- 보고서
- 논평
그리고 데이터베이스 컨텍스트가 있다고 가정합니다.
var reports = db.Reports();
각 보고서에 대한 모든 의견이로드되었는지 어떻게 확인할 수 있습니까?
이 시점에서 나는 데이터베이스에서 연결을 끊고 싶지만 여전히 주석에 액세스 할 수 있습니다. (예를 들어:)
reports[0].Comments[0].Subject
해결책
보고서와 의견 사이에 1m FK 관계가 있다고 가정하고 있습니다 (1 보고서가 많은 의견을 가질 수 있음)?
한 가지 옵션은 dataloadoptions.loadwith 방법 - 다음과 같은 것 :
var reports = db.Reports();
DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<Reports>(r => r.Comments); // Ask for Comments along with reports
reports.LoadOptions = dlo;
이제 해당 데이터 컨텍스트에 대한 보고서를 선택할 때마다 주석이 DB에서 가져 오게됩니다.
주석의 모든 필드가 선택 될 것임을 조심하십시오.이 방법을 사용하여 필드의 하위 집합을 선택하는 방법은 없습니다.
또 다른 옵션은 LINQ 쿼리에서 선택하려는 내용에 대해 구체적입니다
var myReportsList = from report in db.Reports
select new { // Using anonymous type, but could use a custom class
Report = report,
Comment = report.Comment.Detail, // for example
Subject = report.Comment.Subject
};
쿼리가 실행되고 데이터베이스 연결이 닫힌 시점을 이해하려면 다음을 이해해야합니다.
- LINQ 및 LINQ에서 SQL의 지연된 실행 모델 (기본적으로 LINQ에서 SQL의 경우 쿼리는 수집을 반복하거나 그리드에 바인딩하여 결과를 요구할 때만 실행됩니다).
- iqueryable과 ienumerable의 차이
Jon Skeets "C# in Depth"는 이에 대한 훌륭한 개요를 제공하며 "Linq in Action"에 대해 매우 좋은 소식을 들었습니다. 또한 이러한 개념에 대한 블로그 게시물이 많이 있습니다. 여기; o)
다른 팁
로드 옵션을 사용하여 멀티 홉 경로 (보고서, 주석, 다른 참조)를 정의하면 매우 비효율적 인 코드별로 3 번째 및 추가 홉이로드됩니다 (1 : N 관계). 부모당 하나의 쿼리. 보고서 작성의 경우 괜찮습니다. 2 쿼리로 가져갈 것입니다.
제휴하지 않습니다 StackOverflow