2011-07-07 23 views
9

問題があります。私はスタックオーバーフローでこれに対する既存の答えを理解することはできませんし、LINQ to SQLには新しくなって自分自身を掘り下げることができません。単純なSQLグループをLINQからSQLへ変換

は、このSQLを参照してください:

select p.Name as ProductName, SUM(o.NumberOf) as TotalOrdered from [Order] o 
    join [Product] p on o.ProductId = p.Id 
    group by p.Name 

は左の製品名および右側の列に(すべての注文全体で)順序付けられた総数その製品との素敵な2列のテーブルを返します。これをLINQでSQLにどのように複製できますか?ここで

は、私がこれまで持っているものです:

var ctx = new DataClasses1DataContext(); 
var totalProducts = (from o in ctx.Orders 
        join p in ctx.Products on o.ProductId equals p.Id 
        select new { p.Name, o.NumberOf }) 
    .GroupBy(t => t.Name) 
    .Select(g => g.Key, ...); 

で行く何...?

答えて

25

かもしれないよりも、あなたが望むようにそれは私になります

.Select(g => new { ProductName = g.Key, TotalOrdered = g.Sum(x => x.NumberOf) }) 

あなたはどちらかとしてあなたの全体のクエリを行うことができます1つのクエリ式を使用しても、クエリ式を使用しなくても使用できます。

var totalProducts = ctx.Orders 
         .Join(ctx.Products, o => o.ProductId, p => p.Id, 
          (o, p) => new { p.Name, o.NumberOf }) 
         .GroupBy(t => t.Name, 
           pair => pair.Name, // Key selector 
           pair => pair.NumberOf, // Element selector 
           (key, numbers) => new { 
            ProductName = key, 
            TotalOrdered = numbers.Sum()) 
           }); 

または:

var totalProdcuts = from o in ctx.Orders 
        join p in ctx.Products on o.ProductId equals p.Id 
        group o.NumberOf by p.Name into g 
        select new { ProductName = g.Key, TotalOrdered = g.Sum() }; 
+0

これは正しいです。ちょうどチェックした。私の脳死の瞬間を助けてくれてありがとう。 – Lisa

+1

@Lisa:OK - さらに編集します... –

+0

あなたのアップデートに対応して、私は既に名前でグループ化しています。 – Lisa

2
TotalOrdered = g.Sum(o => o.NumberOf) 

....のための上記のメイク使用文は

select new { ProductName= g.Key, TotalOrdered = g.Sum(o => o.NumberOf) }; 

var query = from o in ctx.Orders 
      join p in ctx.Products on 
      o.ProductId equals p.Id 
      group o by new { p.Name, o.NumberOf } into g 
      select new { ProductName= g.Key, TotalOrdered = g.Sum(o => o.NumberOf) }; 
+0

私は合計を得る方法を理解しています。私を混乱させたのは、それを投影にいかにして得るかでした。 – Lisa

+0

@Lisa - 今すぐお試しください –

+0

はい、これも完全に動作します。私はそれが私が最初に探していたものだったと思う。 LINQ-to-SQLとLinq拡張を混在させるよりはるかにエレガントです。 – Lisa

0

はちょうどこれはGroupJoin方法によって達成することができる方法を知っていると便利です場合には、ここでこれを貼り付け:

var totalProducts = ctx.Products.GroupJoin(ctx.Orders, 
    outerKeySelProduct => outerKeySelProduct.Id, 
    innerKeySelOrder => innerKeySelOrder.ProductId, 
    (outerKeySelProduct, innerKeySelOrder) => new 
    { 
     ProductName = outerKeySelProduct.Name, 
     TotalOrdered = innerKeySelOrder.Select(n => n.NumberOf).Sum() 
    }); 

それを向上させることができるならば、それは編集するためにハッピー。

関連する問題