2016-05-13 44 views
0

的過濾器我有一個不能爲空場(NumC#實體框架選擇最大哪裏不能爲空場

class MyTable 
{ 
    //... 
    public int Num { get; set; } 
    public string Category { get; set; } 
    //... 
} 

想找到最大NumCategory == "A"

var maxnum = myTable 
    .Where(r => r.Category == "A") 
    .Max(r => r.Num); 

發生問題時,有沒有任何記錄category == "A"。由於Where()的結果爲空,所以Max()的結果將爲空,但當Num不可爲空時,發生異常。

我可以通過在表設計中將Num設置爲可以修復它,但我不喜歡這個解決方案,而Num應該有價值,不應該爲空。

有什麼建議嗎?有沒有一種方法可以讓Num接受空值,而Num不可空?或更好的查詢?

+0

因此,如果查詢的where部分(r => r.Category.Equals(「A」)'部分爲null,'Num'不可爲空,我希望它會給你一個異常,因爲沒有'Num'的記錄,其中'Category.Equals(「A」)''查看'DefaultIfEmpty' –

+0

參見[DefaultIfEmpty()](https://msdn.microsoft.com/zh-cn/library/ bb360179(v = vs.100).aspx) – sammarcow

回答

5
int maxShoeSize = Workers.Where(x => x.CompanyId == 8) 
        .Select(x => x.ShoeSize) 
        .DefaultIfEmpty(0) 
        .Max(); 

參見:Max return value if empty query

+0

確定重複的問題!雖然我在搜索中找不到這個問題,但無論如何,我爲這個問題添加了一些標籤,可能會在稍後幫助您更好地搜索結果 – Hamid

2

有,我接受民空值,而民不可爲空值的方法嗎?當然

,您可以:

//... 
.Max(r => (int?)r.Num); 

每一個非空值可以變成可空的(但不是反之亦然)。我個人更喜歡這種方法(在異常消息中建議使用此方法),因爲它允許我區分無最大值和最大值0(零),甚至區分int.MinValue

+0

UP for for answers to the additional ask 。我認爲DefaultIfEmpty對於這樣的問題是更好的解決方案,但是如你所說,如果我們不喜歡0爲空,它會更好。 – Hamid

0

你可以試試:

var maxnum = myTable 
    .Where(r => r.Category == "A") 
    .Max(r => r.Num) ?? 0; 

然後你就可以與0的結果工作。