2012-07-18 67 views
2

有人問我的T-SQL語句轉換成LINQ到EF查詢:實體框架,最大查詢

SELECT * FROM CopperPrices 
where ID in 
    (select max(ID) as ID from copperprices group by market, pname) 

我用普通的LINQ到對象的觀點並給出以下答案:

class CopperPrice 
{ 
    public int ID { get; set; } 
    public string Market { get; set; } 
    public string PName { get; set; } 
} 

var result = from p in copperPrices 
     group p by new { Market = p.Market, PName = p.PName } into g 
     select g.OrderByDescending(p => p.ID).First(); 

但它不是在EF工作,因爲下列情況除外:

的方法「第一」只能作爲最後的查詢操作。在這種情況下,而不是

,在上面的T-SQL語句轉換成一個LINQ查詢語句 考慮使用方法「FirstOrDefault」?

+2

當您按照錯誤消息的建議進行操作時會發生什麼?如果你知道你有一個非空集合,那麼FirstOrDefault應該給出與First相同的結果,所以如果FirstOrDefault被EF接受而First不是FirstOrDefault。 – hvd 2012-07-18 12:28:35

回答

1

在這裏你去:

var result1 = copperPrices.GroupBy(g => new { g.Market, g.PName }).Select 
    (
     x => x.ToList().OrderByDescending(z => z.ID).FirstOrDefault() 
    ); 

這裏最重要的部分是。選擇(X => x.ToList())。 ToList返回一個IGrouping的值,每個值都是你最終要訂購的,並選擇最大值。

+1

我的linq語句顯然可以返回一些項目。 – 2012-07-18 05:25:55

+0

你的兩個查詢,如果它們可以運行,都返回一個值。 – hvd 2012-07-18 12:30:11

+0

@ hvd他們運行並返回相同的結果。他們確實返回一個單一的值,但是這個值是一個可以列舉的「分組」。分組內部都是具有最大ID的「CopperPrices」。 – Thelonias 2012-07-18 12:43:20