문제

두 개의 테이블이 있다고 가정 해 봅시다.

  • 보고서
  • 논평

그리고 데이터베이스 컨텍스트가 있다고 가정합니다.

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 쿼리로 가져갈 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top