2012-08-23 50 views
3

當我用.FirstOrDefault方法查詢數據庫時,我如何處理它給我的結果?我特別關注空值,目前我有類似的東西:我如何處理.FirstOrDefault方法?

if (result == default(TypeOfResult)) 
{ 
    handleIt(); 
} 

但我完全不知道這是什麼「默認」,所以我想知道,如果它是不是更好做這樣:

if (result == null) 
{ 
    handleIt(); 
} 

哪一個可以工作?而這個「默認」究竟是什麼?

+1

檢出這個Stackoverflow鏈接的一些想法.. http://stackoverflow.com/questions/8339988/performance-of-linq-any-vs-firstordefault-null – MethodMan

回答

7

FirstOrDefault將序列或字面上所討論的類型的默認值中返回的第一個元素。

因此,根據您查詢的內容,默認值可能會改變。例如,intdefault值的集合將爲0.因此,檢查null是行不通的。

考慮:

List<int> s = new List<int>(); 
var x = s.FirstOrDefault(); 

這裏x就等於0

如何引用類型?

List<MyCustomClass> s = new List<MyCustomClass>(); 
var x = s.FirstOrDefault(); 

這裏xnull

這是兩種方法可能是更好的:

if (result == default(TypeOfResult)) 
{ 
    handleIt(); 
} 
5

TypeOfResult如果是引用類型然後

result == default(TypeOfResult)result == null意味着同樣的事情

因爲null中引用類型的默認值。

default keyword只是在null的引用類型的情況下返回給定類型的「默認值」。對於值類型,它取決於類型,例如0代表int

而顧名思義,FirstOrDefault將返回集合的第一個元素或給定類型的默認值(如果集合爲空)。

0

您應該檢查Null。 如果找不到任何結果,FirstOrDefault將返回NULL。

看到這個POST

+0

只有null,如果它是一個引用類型... –

1

如果你想你保證你的代碼可以工作failsave默認(T),其中T是一個值類型,您可以將項目放在Nullable對象中。

例如:

var ints = new List<int>(){1,2,3,4,6}; 
int result = ints.Where(i => i == 0).FirstOrDefault(); 

結果是0,即使沒有在列表中沒有0!

var ints = new List<int>(){1,2,3,4,6}; 
var nullable = ints.Select(i => new Nullable<int>(i)); 
var result = nullable.Where(i => i == 0).FirstOrDefault() 

結果爲空,列表中沒有0!

這當然比較慢,需要更多的內存,但也適用於非值類型。