在表單輸入類型的程式開發中,常常需要驗證使用者輸入的資料是否存在資料庫?
ㄧ般人直覺都會用 Count() 去判斷是否有資料?
但在 LINQ 使用 Count(),產生的SQL 語法是長這樣
SELECT COUNT(*) AS [value] FROM [dbo].[Registrations] AS [t0] WHERE [t0].[EmailId] = @p0 and [t0].Password = @p1
使用 Count() 缺點為,集合愈大,速度也會愈慢。
以 T-SQL 的觀點來說,Any() 的指令對 DBMS 來說因為不需要去讀取索引與資料分頁,
所以速度上會比 SELECT COUNT( * ) 要快,對於其他類似的 LINQ Provider 來說,多半也會有相同的作法。
SELECT (CASE WHEN EXISTS( SELECT NULL AS [EMPTY] FROM [dbo].[Registrations] AS [t0] WHERE [t0].[EmailId] = @p0 and [t0].Password = @p1 ) THEN 1 ELSE 0 END) AS [value]
結論
- 當集合是來自不確定個數的 IEnumerable<T> 時,請使用 Any() 來判斷集合中是否有資料。
- 當集合是來自外部資料來源 (ex: LINQ to SQL, LINQ to Entities) 時,請使用 Any()。
- 當集合是來自 .NET Framework 內建的集合時,不論 Any() 或 Count() 都可以。
補充
- Any()回傳為 true: 存在
- Any()回傳為 false: 不存在
參考文獻: http://www.dotblogs.com.tw/regionbbs/archive/2013/04/10/when.to.use.any.or.count.in.linq.aspx