2010-10-25 3 views
2

Je veux retourner une seule ligne de la table des utilisateurs en utilisant id compte de domaine comme ma cléLINQ SingleOrDefault

primaire et unique Mais quand j'utilise SingleOrDefault et voir sa traduction sql il effectue toute select * from utilisateurs

ma requête est ..

var user = base.SingleorDefault(t=>t.domainaccountid) 

Je veux que cela revienne juste une rangée!

+0

Ancienne question, mais 'SingleOrDefault' doit interroger toute la table car elle doit vérifier qu'il n'y a qu'un seul élément. – wes

Répondre

1

Vous pouvez essayer Where avec FirstOrDefault:

var user = base.Where(t => t.domainaccountid == 123).FirstOrDefault(); 
+0

SingleorDefault (pred) fait toujours un 'WHERE', donc je ne pense pas que cela soit directement lié (bien que' FirstOrDefault' soit souhaitable pour le comportement 'TOP 1') –

4

Qu'est-ce que base? Est-il possible que vous l'ayez contraint à IEnumerable<T> à un moment donné plutôt qu'à IQueryable<T>? que causerait ceci. Notez que la composition de la base de données n'est possible que si vous utilisez IQueryable<T>, donc si l'une de vos méthodes a retourné quelque chose autre que cela, la composition se terminera.

0

Essayez

var user = base.SingleorDefault(t=>t.domainaccountid==123); 
+0

Bienvenue sur stackoverflow! Il est toujours préférable de fournir une brève description d'un exemple de code pour améliorer la précision de la publication :) –

0

SingleOrDefault recherche des entrées uniques, il devrait faire:

SELECT TOP 2 * FROM TABLE 

Il fait cela pour que si elle trouve 2 résultats il lancer une exception car il est pas unique .

Si vous ne vous souciez pas de le trouver comme un objet unique, comme vous avez d'autres mesures en place pour éviter les doublons; ou tout simplement ne vous pouvez pas utiliser des soins FirstOrDefault de la manière suivante:

array.FirstOrDefault(x => x.id == someOtherId); 

Cela effectuer les opérations suivantes:

SELECT TOP 1 * FROM TABLE 

Cela obtenir vos résultats plus rapidement, en particulier dans les grandes tables, car il ne sera retourner dès que le premier résultat est trouvé.