2010-07-08 3 views
1

나는 다음과 같은 명령이 있습니다Entity Framework - 하나의 쿼리를 사용하여 1 : 1 테이블이 포함 된 테이블의 데이터를로드합니까?

var query = from x in context.FirstTable.Include("SecondTable") 
where x.TestColumn == 5 && 
x.SecondTable.SecondTestColumn == 3 
select x; 

지금 나는 또한 "ThirdTable"라는 세 번째 테이블에서 항목을로드 할. 그러나 SecondTable 테이블을 통해서만 참조 할 수 있습니다. FirstTable에서 SecondTable까지의 외래 키와 SecondTable에서 ThirdTable까지의 외래 키가 있지만 FirstTable에서 ThirdTable까지의 외래 키는 없습니다.

다음 쿼리를 사용할 수 없습니다.

var query = from x in context.FirstTable.Include("SecondTable").Include("ThirdTable") 
where x.TestColumn == 5 && 
x.SecondTable.SecondTestColumn == 3 
select x; 

을 또는 내가 다시 그 쿼리에서 벗어나 모든 결과 집합에 대한 ThirdTable에 추가 쿼리를 수행해야합니다 예외는 FirstTable에서 ThirdTable로 탐색 할 수 있었다?

미리 감사드립니다.

크레이그 Stuntz :

나는이 다음 외래 키 : 표 < -> 표 2 < -> 표 3
의이 테이블은 다음과 같은 방법 가정 해 봅시다 : 주문 < -> 고객 <이 ->

을 customer_preferences

그래서 주문에서 customer_preferences로 외래 키를 만들 필요가 없습니다.
대부분의 경우 불필요합니다. 이번에는 데이터베이스 라운드 트립을 추가로 안전하게하고 싶습니다.

+0

양 끝에 FK가없는 이유가 있습니까? –

+0

외래 키를 가지고 있지만 Table1에서 Table3까지의 FK는 제 생각에는 필요하지 않습니다. 내 업데이트 된 게시물을 참조하십시오. 또는 orders 테이블에 customer_preference_id를 추가해야한다고 생각합니까? – Chris

+0

좋아, 네가 필요한 FK를 가지고있는 것처럼 들리 네. 나는 아래에서 대답 할 것이다. –

답변

2

같은 것을 시도 할 수

var query = from x in Invoices 
    join p in Products 
    on x.Invoice_id equals p.Invoice_id 
    join c in Customers 
    on x.Customer_id equals c.Customer_id 
    where p.Customer_id == 123 
    && c.Description == "some description" 
    select x; 

:

var query = from x in context.FirstTable.Include("SecondTable.ThirdTable") // remember, these are property names, not table names 
      where x.TestColumn == 5 
         && x.SecondTable.SecondTestColumn == 3 
      select x; 

또는 (이는 방법 저는 주로) 투영을 사용합니다 :

var query = from x in context.FirstTable 
      where x.TestColumn == 5 
         && x.SecondTable.SecondTestColumn == 3 
      select new PresentationModel 
      { 
       FirstTableColumn = x.Something, 
       SecondTableColumn = x.SecondTable.SomethingElse, 
       ThirdTableColumn = x.SecondTable.ThirdTable.StillMore 
      }; 

이것은 SecondTable을 가정합니다 : ThirdTable은 1 : 1입니다 (사용자는 말하지 않습니다). 1 : * 인 경우 다음과 같이하십시오.

var query = from x in context.FirstTable 
      where x.TestColumn == 5 
         && x.SecondTable.SecondTestColumn == 3 
      select new PresentationModel 
      { 
       FirstTableColumn = x.Something, 
       SecondTableColumn = x.SecondTable.SomethingElse, 
       ThirdTableStuff = from y in x.SecondTable.ThirdTable 
            select y.StillMore 
      }; 
+0

고마워요.이게 내가 찾고 있던 바로 그거야! – Chris

1

올바르게 기억하면 첫 번째 표의 경우에만 포함됩니다. 당신이 대신 같은 것을 할 수 있습니다 : 당신은 또한 당신이 열망로드를 통해이 작업을 수행 할 수있는이

var query = from x in context.FirstTable.Include("SecondTable").Include("SecondTable.ThirdTable") 
where x.TestColumn == 5 && 
x.SecondTable.SecondTestColumn == 3 
select x; 
+1

EF 쿼리에서 조인은 거의 필요하지 않습니다 (올바르게 구조화 된 db와 올바르게 정의 된 모델이있는 경우). 사실, 귀하의 대답은 조인이없는 쿼리가 더 읽기 쉬운 이유 중 좋은 예입니다. Btw, eager loading이 가능하다면 엔티티 그래프 전체가 반입되고 Include는 필요하지 않습니다. – Yakimych

관련 문제