2016-08-31 9 views
1

次のLINQクエリでは、受注していない顧客を含む受注総数を持つ顧客をAllと表示する必要があります。LINQクエリ - 受注なしの顧客を含む受注件数を表示する

モデル

​​

LINQクエリ:質問:どのように私は(何の秩序を持っていないものを含む)ALL顧客を表示することができ、顧客ごとの注文の合計数(ZEその得意先受注テーブルにない)

var Query1 = from c in Customers 
      join o in Orders into co 
      from t in co.DefaultIfEmpty() 
      select new {CustomerID = c.CustomerId, OrderID = (t == null ? 0 : t.OrderId)}; 
+1

を返します。このような方法でstatemebtを選択してください。 select new {CustomerID = c.CustomerId、TotalOrders =(t == null?0:c.Orders.Count())}; –

答えて

0

あなたは基本的に顧客テーブルと顧客注文テーブルの間でLEFT JOINを実行し、その結果に基づいて各顧客の注文をカウントするグループを実行する必要があります。あなたはこのクラスは、左の各項目を格納することで、この

public class CustomerOrder 
{ 
    public int CustomerId { set; get; } 
    public int? OrderId { set; get; } 
} 

のようなクラスを持っていると仮定すると

が結果今

に参加するには、最初にLEFTを行う必要があり、結果を登録しようとプロジェクトCustomerOrderクラスのオブジェクトのリストにそのことを、そして、その

var usersWithCount = (from c in db.Customers 
    join o in db.Orders on c.CustomerId equals o.CustomerId 
    into result 
    from sub in result.DefaultIfEmpty() 
     select new CustomerOrder{ OrderId= sub!=null ? sub.OrderId :(int?) null, 
            CustomerId = u.CustomerId } 
) // Here we have the left join result. 
.GroupBy(g => g.CustomerId , (k, orders) => new { 
        CustomerId = k, 
        OrderCount = orders.Count(t=>t.OrderId !=null)}).ToList(); 

結果STOの上にGROUPBYを行いますusersWithCountの赤は、CustomerIdOrderCountという特性を持つ匿名オブジェクトのコレクションになります。

0

たもの、それはすべての顧客のためにOrdersを反復ので、これは非常に効率的ではありませんが、それは仕事を得るでしょうのためのRO:

var query = Customers 
    .Select(c => new 
     { 
      Name = c.Name, 
      NumOrders = Orders.Count(o => o.CustomerId = c.CustomerId) 
     }); 

foreach (var result in query) 
    Console.WriteLine("{0} -> {1}", result.Name, result.NumOrders); 
+1

これは顧客ごとにサブクエリを生成しますが、効率的ではありません。 –

+0

@SirajMansourそれは私の答えの先頭で私がすでに言ったことです。しかし、確認していただきありがとうございます。 – itsme86

+0

この場合、サブクエリは得られますか?通常、私はLinqPadを使用して、そうであるかどうかを検証します。しかし、その場合、私は質問にLaurentのコメントで書かれたように質問を書いたでしょう。 – Phil1970

0
var Query1 = from c in Customers 
    join o in Orders on c.CustomerId equals o.CustomerId into OrdersGroup 
    from item in OrdersGroup.DefaultIfEmpty(new Order { OrderId = 0, CustomerId = 0 })      
    select new {CustomerID = c.CustomerId, OrderID = (item == null ? 0 : item.OrderId)}; 

これは、顧客と注文の関係がある場合は、あなたが参加する必要があり、ちょうどあなたを適応していないすべての顧客(彼らは何の注文を持っていない場合でも)と受注

https://dotnetfiddle.net/BoHx2d

関連する問題