Avec Entity Framework, est-il préférable d'utiliser .First() ou .(1) pour le “TOP 1”?
Nous sommes la mise en œuvre de certaines EF référentiels de données, et nous avons quelques requêtes qui comprendrait TOP 1
J'ai lu de nombreux postes, ce qui suggère d'utiliser .Take(1)
Le code je suis l'examen utilise .First()
Je comprends que ces deux produisent le même résultat pour l'assignation d'un objet, mais sont-ils à la fois fait résoudre à la même requête? Lorsque la DB est interrogé, il va réellement être avec TOP 1
pour les deux demandes? Ou vont-ils exécuter la requête en plein dans le énumérable, puis il suffit de prendre la première entrée dans la collection?
En outre, si nous avons utilisé .FirstOrDefault()
alors pourquoi devrions-nous nous attendre à des comportements différents? Je sais que lors de l'utilisation d'un IEnumerable, appelant .First()
sur un vide collection va lancer, mais si ce est en fait seulement la modification de la requête afin d'inclure TOP 1
alors je devrais attendre absolument aucune différence fonctionnelle entre .First()
et .FirstOrDefault()
.... droit?
Sinon, est-il une meilleure méthode que ces Énumérable prolongations pour faire la requête à exécuter TOP 1
?
- Comment transformer votre
.Take(1)
de la requête dans un objet? - Utilisation
First()
si vous souhaitez qu'un élément. UtilisationTake(1)
si vous voulez un seul élément de la séquence.
Vous devez vous connecter pour publier un commentaire.
De LINQPad:
C#:
SQL:
*Notez que
Take(1)
énumère et renvoie unIQueryable
.Rediriger le DataContext Journal propriété de la Console.Ou un fichier de Texte et de voir ce qui vous permet d'interroger chaque option donne.
Vous pouvez également utiliser Seul
Unique() fonctionne sur une collection de exactement un objet et retourne simplement l'objet.
Comment
.First()
travaux:Et
.Take(int count)
toujours itérer.Si il y a un gain, il se produit si la collection met en œuvre
IList
et de la vitesse pour accéder au premier élément à l'indice est plus élevé que celui de retour d'un itérateur. Je ne crois pas qu'il sera importante. 😉Sources:
http://www.hookedonlinq.com/FirstOperator.ashx
http://www.hookedonlinq.com/TakeOperator.ashx
.First()
travaille dans une énumération. Je fais une demande dans le contexte de la requête produite ici.Première demande de Prendre 1, donc il n'y a pas de différence dans la requête. L'appel de FirstOrDefault sera un pas de déclaration, parce que Prendre renvoie IEnumerable faire, vous aurez besoin d'appeler d'Abord de toute façon.
Première sera de jeter l'exception donc FirstOrDefault est toujours préféré.
Et bien sûr les gens qui ont écrit requête EF convertisseur sont assez intelligents pour appeler Prendre 1 à la place de l'exécution d'ensemble de l'ensemble de résultats et de retourner le premier élément.
Ainsi, vous pouvez vérifier à l'aide du générateur de profils SQL.