2012-02-22 73 views
2

列表獲取最大我有以下表的LINQ從記錄

ID Amt Received SchoolAmt 
-- ---- -------- ------- 
2 55 N   
2 88 Y   7 
2 44 N   6 
3 5 N 
3 9 N 
4 5 N   32 
5 33 Y 
6 43 N 
7 54 N   66 

對於給定的ID,我需要找到的最大數量,然後檢查是否它被標記爲Y如果是這樣,標記結果爲布爾true爲false。要做到這一點

一種方法是:

db.Exp. 
    Where(x => x.ID == id) 
    .OrderByDescending(x => x.Amt) 
    .Take(1) 
    .Any(x => x.Received == "Y"); 

其作品,但我還需要補充一點SchoolAmt也應該是大於0

爲什麼以下不工作:

db.Exp. 
    Where(x => x.ID == id) 
    .OrderByDescending(x => x.Amt) 
    .Take(1) 
    .Any(x => x.Received == "Y" && x => x.SchoolAmt > 0); 

當我嘗試鍵入x => x.SchoolAmt> 0時Visual Studio不允許它,因爲它似乎是不正確的syntex。

回答

0

謂語應該寫成:

.Any(x => x.Received == "Y" && x.SchoolAmt > 0); 

這是一個代表,它被映射到一個函數,看起來類似於:

static bool someCompilerGeneratedName(YourClass x) 
{ 
    return x.Received == "Y" && x.SchoolAmt > 0; 
} 

因爲這是一個代表,和一個單一的方法,你只需要在那裏的=>開始創建lambda。兩個標準檢查使用相同的變量(x)。

+0

我怎麼知道什麼時候使用&& X .SchoolAmt> 0與我所擁有的。意思是,我看到過類似於x => x.Received ==「Y」&& x => x.SchoolAmt> 0,用於 – 2012-02-22 22:40:15

+0

之前的where子句@Nate「x =>」正在製作一個lambda表達式。這基本上是讓編譯器爲你創建一個方法。 「x」是方法的參數,之後的所有內容都是方法體中包含的內容。每個謂詞只能使用一次(在開始處)。 – 2012-02-22 22:47:26

+0

@NatePet編譯器將我的答案中的第一個代碼塊變成類似於第二個代碼塊 - 「x =>」被映射到它爲您製作的方法的「(YourClass x)」參數列表。 – 2012-02-22 22:48:20

1

嘗試

.Any(x => x.Received == "Y" && x.SchoolAmt > 0); 
0

我建議增加通過的NuGet的MoreLinq庫這會給你的MaxBy/MinBy擴展,然後使用以下

db.Exp. 
    Where(x => x.ID == id) 
    .MaxBy(x => x.Amt) 
    .Any(x => x.Received == "Y" && x.SchoolAmt > 0);