2010-05-18 19 views
0

Je vérifie la connexion d'un utilisateur par cette méthode référentiel,résultat de la requête que dois-je utiliser COUNT() ou tout()

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; 
    } 

j'ai vu dans l'une des questions précédentes !query.Any() serait plus rapide ... Lequel dois-je utiliser? Toute suggestion ....

Répondre

4

Le SQL généré sera différent entre les deux appels. Vous pouvez vérifier en configurant votre propriété context.Log sur Console.Out ou sur quelque chose.

Voici ce que ce sera:

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] 

Dans ce cas, je doute qu'il fera une différence parce que EMAILID est probablement un index unique donc il ne peut y avoir 1 résultat. Dans un autre cas où count peut être> 1, Any serait préférable car la deuxième requête permet au serveur sql de court-circuiter la recherche car il suffit de trouver un pour prouver qu'il en existe.

2

Vous pourriez exprimer un peu plus court comme celui-ci:

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

donc vous pensez que Any() serait plus approprié .. –

+0

@Pandiya Chendur Je doute que vous verrez une différence de performance entre 'Any()' et 'Count() == 0'. Après tout, l'instruction sql générée ** devra ** vérifier s'il existe un enregistrement dans un sens ou dans l'autre. –

+4

Mais en ce qui concerne les humains qui lisent le code? Il est certainement plus simple à comprendre si l'on dit: "retourner s'il y a un utilisateur avec cet e-mail et passer" au lieu de "retourner si le nombre d'utilisateurs avec cet e-mail et passer n'est pas 0". – ANeves