2009-11-23 5 views
1

고객 컬렉션이 있습니다. 고객에는 주문이라는 또 다른 콜렉션이 있습니다.Linq 투영

주문 번호는 OrderDate, PurchaseID입니다.

어떻게 OrderDate> QueryDate가있는 주문 만 포함하는 새로운 고객 컬렉션을 제공하는 Linq 쿼리를 작성합니까?

토론을 돕기 위해 관련 코드 세트가 있습니다. 나는 그 개념을 이해할 필요가있다.

class Customer 
{ 
    List<Order> Orders; 
} 

class Order 
{ 
    string Name; 
    Date OrderDate; 
    int PurchaseID; 
} 

List<Customer> customers; 

내가 알지 못했던 새로운로드 블록을 실행 중입니다. Orders는 읽기 전용 속성입니다. 그것은 customers.Orders.Add (...)를 통해 SharePoint 액세스가 작동하지 않을 경우 액세스 할 수 있어야합니다. 그렇다면 필터링 된 주문 만 주문에 추가하려면 어떻게해야합니까?

답변

1

가정 클래스 정의를 정확히 규정을 제외하고 필드 (또는 속성)를 공개하고, Customer 빈 컬렉션의 Orders를 초기화 기본 공용 생성자를 가지고, 당신이 (L2O에 당신을 제한하고, L2S 또는 EF 사용하지 못하도록 할) 성명 (λ)을 사용하는 경우 당신은 그것을 할 수 있습니다 :

var result = customers.Select(c => 
{ 
    var cf = new Customer(); 
    cf.Orders.AddRange(c.Orders.Where(o.OrderDate > QueryDate)); 
    return cf; 
}); 

불행하게도, 식 람다와 함께 할 수있는 방법이 없기 때문에 C#을 컬렉션 이니셜 라이저를 사용하면 컬렉션을 내부로 연결할 수 없습니다.

+0

을 참조하십시오. 우리가이 작업을 완벽하게 수행하려면 두 가지 방법이 모두 가능하면 좋을 것입니다. 감사합니다 – firefly

+0

컬렉션 초 기자 컨텍스트에서'IEnumerable'을 자동으로 확장하도록 C# 기능을 요청했습니다 (예 :'new Customer {Orders = {c.Orders.Where (o.OrderDate> QueryDate)}}'- https를 참조하십시오. : //connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx? FeedbackID = 377830, C#의 이후 버전에서이 기능 (또는 동일한 것에 대한 다른 구문)을보고 싶다면 투표하십시오. –

1

SelectMany는 투영 및 병합 데이터 구조에 사용됩니다. 많은 오버로드가 있지만 가장 간단한 오버로드가 있습니다.

customers.SelectMany(c => c.Orders).Where(o => o.OrderDate > queryDate); 
+0

내가 오해하지 않는다면 주문 집합이 필터링 된 고객 모음을 원하는 주문 모음을 제공합니다. – firefly

+0

당신이 맞습니다, 미안 해요 질문을 잘못 읽었을 것입니다. 나는 당신이 주문 모음을 원한다고 생각했습니다. –

2

customers .Select(c => new Customer { Orders = c.Orders.Where(o => o.OrderDate > DateTime.Now)} );

+0

이것은 각 고객이 관련 주문 만 포함하는 고객 콜렉션을 반환 할 것입니다. 이 요청은 주문의 일람표에 대한 것이 었습니다. –

+0

이것은 실제로 내가 찾고있는 것에 더 가깝습니다. 주문은 속성 만 있기 때문에로드 블록에 부딪 히고 있습니다. 내 편집 된 질문 – firefly

0

나는 당신이 Linq에 그것을 할 수 있다고 생각하지 않습니다. 당신은 같은 것을해야 할 것 :

var filtered = new List<Customer>(); 
foreach (var c in customers) 
{ 
    var customer = new Customer(); 
    customer.Orders.AddRange(c.Orders.Where(o => o.OrderDate > queryDate)); 
    filtered.Add(customer); 
}