2011-10-21 3 views
0

SQL Server 데이터베이스에서 주문 컬렉션 (및 주문 라인)을 검색하는 데 nHibernate를 사용하고 있습니다.부모와 자식 모두에 필터를 적용하는 자식 컬렉션을 가져 오는 방법

이 클래스 내 ShipmentOrder입니다 :

public class ShipmentOrder 
{ 
     private ICollection<ShipmentDetail> _ShipmentsDetails; 

     public virtual ReadOnlyCollection<ShipmentDetail> ShipmentsDetails 
     { 
      get { return (new List<ShipmentDetail>(_ShipmentsDetails).AsReadOnly()); } 
     } 
} 

nHibernate 수는 모든 세부 사항 (ShipmentsDetails)와은 IList를 반환로드 (I 열망 부하 그 이후부터).

이제 ShipmentOrder 및 ShipmentDetail 컬렉션을 필터링하고 ShipmentDetail 컬렉션을 되 찾으려합니다.

은 이런 식으로 뭔가를 시도했다 :

IList<ShipmentOrder> Results; 

// Fetch orders using nHibernate 
Results = FetchOrders(); 

var shipmentLines = Results 
    .Where(x => x.Company == "XXX" && x.OrderNumber == "111") 
    .SelectMany(x => x.ShipmentsDetails) 
    .Where(s => s.RowNumber == 1 && s.RowSeq == 0) 
    .ToList(); 

그러나 나는 같은 라인의 여러 결과를 얻을 수 있음을 깨달았다.

var shipmentLines = Results 
    .Where(x => x.Company == "XXX" && x.OrderNumber == "111") 
    .SelectMany(x => x.ShipmentsDetails) 
    .Where(s => s.RowNumber == 1 && s.RowSeq == 0) 
    .Distinct() 
    .ToList(); 

을하고 그것을 잘 작동합니다 :

나는이 같은 람다 식을 변환했습니다. 이없는 동일한 결과를 얻는 더 좋은 방법이 있는지 궁금합니다.

UPDATE : 나는 SelectMany를 사용하고

여기 이것이 내가 아이들 (ShipmentsDetails)에 필터를 적용하기 위해 찾은 유일한 방법입니다 원인이된다.

+0

'Distinct'를 사용하지 않고 별개의 목록을 원하십니까? – Jamiec

+0

@Jamiec : 포함 된 샘플 코드는 한 행을 반환해야하지만 4 개의 행이 있으므로 4 개의 주문이 있습니다. 나는 SelectMany 원인을 사용하고 있는데 그것은 children 컬렉션에 필터를 적용하는 유일한 방법이다. – LeftyX

+1

'x => x.Company == "XXX"&& x.OrderNumber == "111"'단일 ShipmentOrder를 식별합니까? 그렇다면's.RowNumber == 1 && s.RowSeq == 0'은 하나의'ShipmentLine'을 식별합니까? 이 쿼리의 예상 결과는 무엇입니까? – Jamiec

답변

1

Linq2Objects처럼 보입니다. 따라서 IList Results에 중복 레코드가 포함되어있을 수 있습니다.이 경우 루트 엔티티가 중복되어 유감스럽게도 레벨을 가져올 수 있습니다. 쿼리에서 distinctrootentity-resulttransformer를 사용하십시오.

관련 문제