2013-01-17 2 views
1

테이블 2 개 : POHeader 및 PODetail이 있습니다. 연결된 PODetail.ItemId = intItemId가있는 모든 POHeaders를 반환하고 싶습니다. LINQ에서 어떻게하면됩니까?자식 테이블 값을 쿼리하는 방법

이것은 내가 시도한 것입니다.

public IQueryable<POHeader> SearchForWithDetails(int intFacilityId) 
{ 
    return DbSet.Include("PODetails").Where(x => x.FacilityId == intFacilityId); 
} 

그리고 그 결과가 전달되는 :

public IQueryable<POHeader> SearchForPODetailsByItemId(IQueryable<POHeader> poHeaders, int intItemId) 
{ 
    //This returns a type of PODetail not POHeader 
    var q = poHeaders.SelectMany(c => c.PODetails).Where(c => c.ItemId == intItemId); 

    //In this case, I can't figure out the syntax :(
    var p = from poHeader in poHeaders 
      let filteredPOs = from poDetail in poHeader.PODetails 
      where poDetail.ItemId == intItemId 
      select ???? 
    return p; 
} 

올바른 방법은 무엇

먼저 나는 PODetails을 포함하도록 포함 매개 변수를 사용하여 내 저장소에서 방법을 이것을하기 위해?

  1. 단지 된 IQueryable
  2. 창 조인 테이블 리턴 결과 :

    또한, I이 2 개 결과를 예측할 필요가있다.

답변

3

시도해보십시오.

var result = poHeaders.Where(e => e.PODetails.Any(a => a.ItemId == intItemId)); 
+0

오류가 발생합니다. bool을 POHeader로 변환 할 수 없습니다 ?? –

+0

죄송합니다, 지금 고정 –

+0

아, 그게 지금 작동합니다. 따라서 두 가지 방식 모두 작동합니다. 하지만 아마도이 버전은 클리너이기 때문에 아마 사용하게 될 것입니다! 감사합니다 에스테반! –

1

은 Header-> 상세 가정하면 1 대 다수의 관계이며, 상세 다시는 헤더 .Header라고에 대한 탐색이 있습니다

public IQueryable<POHeader> SearchForPODetailsByItemId(IQueryable<POHeader> poHeaders, int intItemId) 
{ 
    var headersForThisItem = poHeaders.SelectMany(pod => pod.PODetails).Where(pod => pod.ItemId == intItemId) 
     .Select(pod=> pod.Header).Distinct();//.Distinct to eliminate duplicates when 2 Details have the same header. Not necessary if ItemId filter naturally provides distinct results. 

    return headersForThisItem ; 
} 

테스트되지 않은,하지만 난 그 생각 당신이 원하는 것을 줄 수 있습니다.

관련 문제