505 votes

LINQ: Quand utiliser SingleOrDefault vs. FirstOrDefault () avec des critères de filtrage

Envisager l'interface IEnumerable les méthodes d'extension SingleOrDefault() et FirstOrDefault()

MSDN documents SingleOrDefault:

Retourne le seul élément d'une séquence, ou une valeur par défaut si la séquence est vide; cette méthode lève une exception si il n'y a plus d'un élément dans la séquence.

alors qu' FirstOrDefault à partir de MSDN (sans doute lors de l'utilisation d'un OrderBy() ou OrderByDescending() ou aucun),

Retourne le premier élément d'une séquence

Envisager d'une poignée de requêtes d'exemple, il n'est pas toujours clair quand à l'utilisation de ces deux méthodes:

var someCust = db.Customers
.SingleOrDefault(c=>c.ID == 5); //unlikely(?) to be more than one, but technically COULD BE

var bobbyCust = db.Customers
.FirstOrDefault(c=>c.FirstName == "Bobby"); //clearly could be one or many, so use First?

var latestCust = db.Customers
.OrderByDescending(x=> x.CreatedOn)
.FirstOrDefault();//Single or First, or does it matter?

Question

Quelles conventions de vous suivre ou de suggérer au moment de décider d'utiliser SingleOrDefault() et FirstOrDefault() dans vos requêtes LINQ?

585voto

Alex Points 2481

Si votre jeu de résultats retourne 0 enregistrements:

  • SingleOrDefault retourne la valeur par défaut pour le type (par exemple, par défaut pour le type int est 0)
  • FirstOrDefault retourne la valeur par défaut pour le type

Si vous jeu de résultats retourne 1 dossier:

  • SingleOrDefault des rendements record
  • FirstOrDefault des rendements record

Si votre jeu de résultat renvoie le nombre d'enregistrements:

  • SingleOrDefault déclenche une exception
  • FirstOrDefault renvoie le premier enregistrement

Conclusion:

Si vous voulez la levée d'une exception si le jeu de résultats contient de nombreux enregistrements, utilisez SingleOrDefault.

Si vous voulez toujours 1 dossier quel que soit le jeu de résultats contient, utilisez FirstOrDefault

465voto

Bryan Menard Points 5664

Chaque fois que vous utilisez SingleOrDefault , vous indiquez clairement que la requête doit aboutir au plus à un seul résultat. D'un autre côté, lorsque FirstOrDefault est utilisé, la requête peut renvoyer n'importe quel nombre de résultats mais vous déclarez que vous ne voulez que le premier.

Personnellement, je trouve la sémantique très différente et l'utilisation de la sémantique appropriée, en fonction des résultats attendus, améliore la lisibilité.

243voto

Stefan Steinegger Points 37073

Il est

  • un semantical différence
  • une différence de performance

entre les deux.

Semantical Différence:

  • FirstOrDefault renvoie un premier élément de potentiellement multiples (ou par défaut si aucune n'existe).
  • SingleOrDefault il n'y a qu'un seul élément et retourne (ou par défaut si aucune n'existe). Plusieurs éléments sont une violation de contrat, une exception est levée.

Différence De Performances

  • FirstOrDefault est généralement plus rapide, il itère jusqu'à ce qu'il trouve l'élément et n'a qu'à itérer l'ensemble énumérable quand il ne le trouve pas. Dans de nombreux cas, il ya une forte probabilité de trouver un article.

  • SingleOrDefault des besoins pour vérifier si il y a un seul élément et, par conséquent, toujours parcourt l'ensemble énumérable. Pour être précis, il itère jusqu'à ce qu'il trouve un second élément et lève une exception. Mais dans la plupart des cas, il n'y a pas de deuxième élément.

Conclusion

  • Utiliser FirstOrDefault si vous n'avez pas de soins le nombre d'éléments ou lorsque vous ne pouvez pas se permettre la vérification de l'unicité (par exemple, dans une très large collection). Lorsque vous vérifiez l'unicité sur l'ajout d'éléments de la collection, il pourrait être trop coûteux de le vérifier à nouveau lors de la recherche de ces éléments.

  • Utiliser SingleOrDefault si vous n'avez pas de soins sur les performances de trop et qui veulent s'assurer que l'hypothèse d'un seul point est clair pour le lecteur et vérifié au moment de l'exécution.

Dans la pratique, vous utilisez First / FirstOrDefault souvent même dans les cas où vous assumez un seul élément, pour améliorer les performances. Vous devriez toujours se rappeler que, Single / SingleOrDefault pouvez améliorer la lisibilité (car il indique l'hypothèse d'un seul élément) et la stabilité (parce qu'il le vérifie) et de l'utiliser de façon appropriée.

76voto

shalke Points 364

Personne n'a mentionné que FirstOrDefault traduit en SQL fait l'enregistrement TOP 1, et SingleOrDefault fait le TOP 2, parce qu'il a besoin de savoir s'il y a plus d'un enregistrement.

10voto

spender Points 51307

J'utilise SingleOrDefault dans des situations où ma logique dicte que la volonté sera soit zéro soit un résultat. S'il y en a plus, c'est une situation d'erreur, ce qui est utile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X