2012-05-09 5 views
1

次のクエリをLinqでSQLに書き込む必要がありますが、それには2つの派生テーブルがあるため、何が最良の方法であるかはわかりません。助言がありますか。これらの線に沿ってどうすればこのためのlinqクエリを書くことができますか?

SELECT A.ID 
FROM 
( 
    SELECT * 
    FROM Orders 
    WHERE ProductID = 5 
) A 
JOIN 
( 
    SELECT CustomerID, MAX(Price) Price 
    FROM Orders 
    WHERE ProductID = 5 
    GROUP BY CustomerID 
) B 
ON A.CustomerID = B.CustomerID and A.Price = B.Price 
+5

これまでのLINQステートメントは?まだLINQPadをお試しください。 – Yuck

答えて

1
var b = (
    from o in db.Orders 
    where o.ProductID == 5 
    group o by o.CustomerID into og 
    select new { 
     CustomerID = og.Key 
     Price = Max(og.Price) 
    } 
); 
var a = (
    from o in db.Orders 
    join p in b on new {a.CustomerID, a.Price} equals 
      new {b.CustomerID, b.Price} 
    where o.ProductID == 5 
    select a.ID 
); 
var r = a.ToString(); 

これらの2つのリンクが非常に貴重です:

+0

なぜあなたは組合を使用していますか? OPのクエリは、最大価格で注文を検索しようとしています。組合はそれを助けません。 – cadrell0

+0

あなたは正しいです。私はその質問を誤って読んだ。それに応じて私の答えを更新。 – robrich

0

何か:このようなものを形成する際

var result = from a in context.Orders 
      join b in (context.Orders.Where(o => o.ProductID == 5).GroupBy(o => o.CustomerID).Select(g => new { CustomerID = g.Key, Price = g.Max(o => o.Price))) 
       on new {a.CustomerID, a.Price} equals new {b.CustomerID, b.Price} 
      where a.ProductID == 5 
      select a.ID; 
1

LINQを使用して、特にクエリ構文の代わりにメソッド構文を使用する場合は、これを簡略化できますか。

orders.Where(o => o.ProductID == 5) 
    .GroupBy(o => o.CustomerID) 
    .SelectMany(g => g.Where(o => o.Price == g.Max(m => m.Price))); 

LINQを書くときのアドバイスは、単にSQL文を正確に変換しようとしないでください。望ましい結果を考え、LINQ用に設計されたソリューションを開発してください。

関連する問題