2012-06-14 39 views
4

關於上述和/或包括其他方法,如果您正在搜索一條記錄,並且只有一條記錄存在,哪條記錄最快?例如,我想確保一旦找到正在查詢的值,我正在尋找一個能夠立即返回而無需搜索剩餘記錄的值。FirstOrDefault(),SingleOrDefault(),Any()等等......哪一個是最快的?

+2

這取決於查詢提供。 – SLaks

+1

'Any'不返回一個值,它返回一個標誌,指示一個值是否存在。 – dasblinkenlight

+2

Any()不會返回記錄。 FirstOrDefault可能是獲取單個記錄的最快方式,但不保證只有一個記錄。 – Blorgbeard

回答

15

如果你有這個想法,你可以解決它。

FirstOrDefault枚舉集,直到找到一個匹配的項目

SingleOrDefault枚舉整個集合,以確保該項目只出現一次

這意味着SingleOrDefault不能比FirstOrDefault更快。但它確實取決於一點點的查詢提供執行

編輯:

任何能更快實現。海外商品會有一個SQL實現:

Select Top 1 from myTable //(its not quite this but this implementation but it will be similar) 

將執行速度比:

Select Top 1 from myTable where <somecondition> 
+0

最後一件事,如果沒有記錄存在,返回空嗎?我「認爲」它是我用過的Single(),當沒有東西回來時拋出異常。 –

+0

如果不存在任何記錄,則singleOrDefault和FirstOrDefault都將返回對象的默認值(在大多數情況下,該值爲null)。如果集合不包含匹配,則使用.First或.Single會引發異常 –

+1

另請參閱... [LINQ:何時使用SingleOrDefault與FirstOrDefault並使用篩選條件](http://stackoverflow.com/q/1745691/9664)和[何時使用.First和何時使用.FirstOrDefault與LINQ?](http://stackoverflow.com/q/1024559/9664) –

1

單(和的SingleOrDefault)應時要強制異常,如果有0或一個以上的結果只能使用。典型的SQL實現將是

Select Top 2 * from table 

另一方面,首先通常會在找到第一個匹配後短路。在TSQL中

Select Top 1 * from table 

任何用於指示是否至少找到一個匹配(並找到它後發現短路)。在TSQL中,這使用Exists。

對於您的情況,由於您需要結果值,因此在創建單獨請求(使用Any)時沒有用處,然後執行Single。相反,只需使用FirstOrDefault,然後在返回結果中檢查null。

var foo = table.FirstOrDefault(t => t.bar == val); 
if (null != foo) 
    ... 

選擇1,從表中已存在地方

相關問題