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; 
} 

それはそれで1つも未出荷のアイテムを持って注文を除外し、このような方法で、2番目のクエリをフレームにどのように?あなたのお時間をありがとうございました。

答えて

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); 

から"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