2012-01-17 3 views
2

주문 테이블이 있습니다. 주문은 여러 항목을 가질 수 있으며 각 항목은 다른 시간에 발송됩니다. 은 부분적으로 배송되거나 주문한을 제외한 모든 주문 목록을 가져오고 싶습니다. 즉, 나는 이 완전히 인 모든 주문 목록을 가져와야합니다. T-SQL에서이 작업을 수행하는 방법을 알고 있습니다. 하지만 LINQ-to-Entities (EF4/.Net 4.0/C#)를 사용하여이 작업을 수행하려고합니다.LINQ to Entities - 예제에서 부분적으로 배송 된 주문을 제외하는 WHERE 절

PK  OrderID  Item  Status 
1  00001  TV   Shipped 
2  00001  TABLET  Shipped 
3  00002  BLURAYPL Not Shipped 
4  00002  MOBILEPH Shipped 
5  00002  XBOX  Shipped 
6  00003  PAPER  Shipped 
7  00003  PENCIL  Shipped 

목표는 출력으로 00001 및 00003을 얻을 수 있습니다 :

는 다음과 같은 데이터를 고려하십시오. 여기

는 지금까지 분명히 단순화 한 것입니다 :

using (MyDBEntities dbcontext = new MyDBEntities()) 
{ 
    var WashingtonClients = from a in dbcontext.CustomerMasterTable 
        where a.City == "Washington" 
        select a.CustomerID; 

var ShippedOrdersToWashingtonClients = from o in dbcontext.OrderDetail 
        where WashingtonClients.Contains(o.CustomerID) 
        && o.Status.ToUpper() == "SHIPPED" 
        //how to exclude Partially Shipped orders here??? 
        select o.OrderID; 
} 

어떻게 그것에서 단 한 번의 발송되지 않은 항목이 주문을 제외하는 방식으로 두 번째 쿼리를 프레임에? 많은 시간을 내 주셔서 감사합니다.

답변

3

의 당신이 당신의 데이터 가짜 목록을 가지고 있다고 가정하자 :

var orderDetails = new List<OrderDetail> 
    { 
     new OrderDetail{ ID = 1, Item = "TV", OrderID = "00001", Status = "Shipped"}, 
     new OrderDetail{ ID = 2, Item = "TABLET", OrderID = "00001", Status = "Shipped"}, 
     new OrderDetail{ ID = 3, Item = "BLURAYPL", OrderID = "00002", Status = "NotShipped"}, 
     new OrderDetail{ ID = 4, Item = "MOBILEPH", OrderID = "00002", Status = "Shipped"}, 
     new OrderDetail{ ID = 5, Item = "XBOX", OrderID = "00002", Status = "Shipped"}, 
     new OrderDetail{ ID = 6, Item = "PAPER", OrderID = "00003", Status = "Shipped"}, 
     new OrderDetail{ ID = 7, Item = "PENCIL", OrderID = "00003", Status = "Shipped"} 
    }; 

그런 다음 LINQ 쿼리는 다음과 같이한다 : 당신은 문자열의 커플은 너무

var result = orderDetails 
    .GroupBy(o => o.OrderID) 
    .Where(g => g.All(i => i.Status == "Shipped")) 
    .Select(g => g.Key); 

- A와 "00001" and "00003"을 결과. 실제 쿼리가이 같은 것을 쓸 수 dB로에 대한

따라서 :

dbContext.OrderDetails 
    .Where(o => WashingtonClients.Contains(o.CustomerID)) 
    .GroupBy(o => o.OrderID) 
    .Where(g => g.All(i => i.Status == "Shipped")) 
    .Select(g => g.Key); 
+0

이 쿼리 구문과 함께 할 수 있습니까? – FMFF

+1

아니요. '모두'에는 쿼리 아날로그가 없습니다. – WarHog

+0

방금 ​​저장 한 매우 복잡한 프로 시저를 작성하지 않았습니다. 고맙습니다. – FMFF