2016-07-28 10 views
1

私はレポートに要約する必要があるテーブルがあります。これは私のサンプルテーブルです。
Linq .GroupBy()の数が

   Orders 
_____________________________________ 
CustomerId | CustomerName | OrderType 
___________|______________|__________ 
1   |  Adam  | Shoe 
1   |  Adam  | Shoe 
1   |  Adam  | Shoe 
1   |  Adam  | Hat 
1   |  Adam  | Hat 
2   |  Bill  | Shoe 
2   |  Bill  | Hat 
3   |  Carl  | Sock 
3   |  Carl  | Hat 

私はループせずに私のviewmodelに戻って渡すために、これを要約しようとしています。これが私が達成しようとしている結果です。

CustomerName | Shoe | Hat | Sock | Total Orders 
------------ | ---- | --- | ---- | ------------ 
Adam   | 3 | 2 | 0 |  5 
Bill   | 1 | 1 | 0 |  2 
Carl   | 0 | 1 | 1 |  2 

//var resultList = dbContext.Orders.OrderBy(o => o.CustomerId); 

希望の結果を得るためにGroupByとCountを使用するにはどうすればよいですか?それがベストなアプローチですか?

+0

は、現在のクエリを含めますあなたは –

+1

を@ un-lucky ..に同意して使用していますし、あなたが働いているdbは –

+2

です項目のリストが3つに固定されているかどうかを明確にしてください。または、異なる項目に基づいて列の数を変えたい場合 –

答えて

6

group clause (C# Reference)

var summary = from order in dbContext.Orders 
       group order by order.CustomerId into g 
       select new { 
        CustomerName = g.First().CustomerName , 
        Shoe = g.Count(s => s.OrderType == "Shoe"), 
        Hat = g.Count(s => s.OrderType == "Hat"), 
        Sock = g.Count(s => s.OrderType == "Sock"), 
        TotalOrders = g.Count() 
       }; 
+0

すてきな解決策。 .FirstOrDefault()に.First()を変更しました。 – pacopicorico

3

項目が固定されている場合:

public List<OrderViewModel> GetCustOrders() 
{ 
    var query = orders 
     .GroupBy(c => c.CustomerName) 
     .Select(o => new OrderViewModel{ 
      CustomerName = o.Key, 
      Shoe = o.Where(c => c.OrderType == "Shoe").Count(c => c.CustomerId), 
      Hat = o.Where(c => c.OrderType == "Hat").Count(c => c.CustomerId), 
      Sock = o.Where(c => c.OrderType == "Sock").Count(c => c.CustomerId), 
      Total = o.Count(c => c.CustomerId) 
     }); 

    return query; 
} 
0

使用のSQLが一つの選択肢である、私はそれをテストし、正確に何をしたい取得:

select p.*, t.total as 'Total Orders' from 
(
    select CustomerName, count(CustomerId) total from Orders group by CustomerName 
) as t inner join 
(
    select * from Orders 
    pivot(count(CustomerId) 
     for OrderType in ([Shoe], [Hat], [Sock]) 
     ) as piv 
)as p on p.CustomerName = t.CustomerName