【LINQ】使用 Any() 判斷集合中資料是否存在

在表單輸入類型的程式開發中,常常需要驗證使用者輸入的資料是否存在資料庫?

ㄧ般人直覺都會用 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

留言

Top