2010-05-18 29 views
0

我對這個倉庫方法檢查用戶的登錄,查詢結果,我應該用什麼計數()或任何()

public bool getLoginStatus(string emailId, string password) 
    { 
     var query = from r in taxidb.Registrations 
        where (r.EmailId == emailId && r.Password==password) 
        select r; 
     if (query.Count() != 0) 
     { 
      return true; 
     } 
     return false; 
    } 

我在以前的問題之一看見!query.Any()會更快...我應該使用哪個?任何建議....

回答

4

生成的SQL將在兩個電話之間的不同。您可以通過將您的context.Log屬性設置爲Console.Out或其他來進行檢查。

下面是它是什麼:

SELECT COUNT(*) AS [value] 
FROM [dbo].[Registrations] AS [t0] 
WHERE [t0].[EmailId] = @p0 and [t0].Password = @p1 

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] 

在這種情況下,我懷疑這將使任何區別,因爲EMAILID可能是唯一索引,所以只能有1個結果。在另一種情況下,count可以大於1,Any會更好,因爲第二個查詢允許sql server將搜索短路,因爲它只需要找到一個來證明存在。

2

你可以表達它頗有幾分短這樣的:

return taxidb.Registrations.Any(r => r.EmailId == emailId && r.Password==password); 
+0

所以你認爲Any()會更合適.. – 2010-05-18 12:00:40

+0

@Pandiya Chendur我懷疑你會看到'Any()'和'Count()== 0'之間的任何性能差異。所有生成的sql語句都會**有**來檢查是否有記錄。 – 2010-05-18 12:03:45

+4

但是對於閱讀代碼的人來說呢?如果它說'返回是否有任何用戶使用此電子郵件並傳遞'而不是'返回具有此電子郵件和傳遞的用戶數量是否不是0',那麼理解它肯定更簡單。 – ANeves 2010-05-18 12:10:17

相關問題