2012-05-09 52 views
1

我需要在Linq to SQL中編寫下面的查詢,但不確定什麼是最好的方式,因爲它有兩個派生表。有什麼建議麼。沿着這些線路如何爲此編寫一個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(); 

這兩個環節是這樣形成東西的時候是非常寶貴的:

+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設計的解決方案。