Voici un aperçu des différentes méthodes:
Find () - lorsque vous souhaitez obtenir un élément par clé primaire. Cela renverra null s'il ne trouve pas d'élément. Il regardera dans le contexte avant d'aller dans la base de données (comme indiqué par Yaron dans les commentaires) qui peut être un facteur d'efficacité important si vous avez besoin d'obtenir la même entité plusieurs fois alors que le même contexte est vivant.
Single () - lorsque vous vous attendez à ce qu'un seul élément soit renvoyé par une requête. Cela lèvera une exception si la requête ne renvoie pas exactement un élément.
SingleOrDefault () - lorsque vous vous attendez à ce que zéro ou un élément soit renvoyé par une requête (c'est-à-dire que vous n'êtes pas sûr qu'un élément avec une clé donnée existe). Cela lèvera une exception si la requête ne renvoie aucun ou un élément.
First () - lorsque vous vous attendez à ce qu'un ou plusieurs éléments soient renvoyés par une requête mais que vous souhaitez uniquement accéder au premier élément de votre code (la commande peut être importante dans la requête ici). Cela lèvera une exception si la requête ne renvoie pas au moins un élément.
FirstOrDefault () - lorsque vous vous attendez à ce que zéro ou plusieurs éléments soient renvoyés par une requête mais que vous souhaitez uniquement accéder au premier élément de votre code (c'est-à-dire que vous n'êtes pas sûr qu'un élément avec une clé donnée existe)
Sales.OrderByDescending(s => s.TotalValue).First();
Single
ouSingleOrDefault
interrogera 2 enregistrements (limite 2) tandis queFirst
ouFirstOrDefault
interrogera pour 1 (limite 1).J'ai toujours tendance à utiliser
FirstOrDefault
. Si vous voulez vraiment être pointilleux avec les performances, vous devez utiliserFirstOrDefault
dans EF. Sous les couverturesSingleOrDefault
utilise top (2) dans la requête car, il doit vérifier s'il existe une deuxième ligne qui correspond aux critères et si c'est le cas, il lève une exception. Fondamentalement,SingleOrDefault
vous dites que vous souhaitez lever une exception si votre requête renvoie plus d'un enregistrement.la source
FirstOrDefault
etSingleOrDefault
pour être significative? Je dirais que c'est une optimisation prématurée dans la plupart des cas.Single()
ouSingleOrDefault()
quand je retourne quelque chose dont il devrait exister que l' un . La raison pour laquelle je le fais est de repérer les bogues en faisant des requêtes mal écrites, qui renvoient plus qu'elles ne le devraient, échouent. Au moins dans mon esprit, cela aidera à garder les données du système cohérentes. Bien sûr, c'est plus lent, mais je suppose que ce n'est pas beaucoup plus lent, et je suis prêt à payer ce prix.C'est vraiment très simple:
Single
renvoie un seul élément et lance une exception s'il n'y a aucun ou plus d'un élément.First
renverra le premier article ou le lancera lorsqu'il n'y a pas d'article.FirstOrDefault
retournera le premier élément ou retournera la valeur par défaut (ce qui estnull
dans le cas où le type donné est un type de référence) quand il n'y a pas d'élément.C'est le comportement que l'API est censée avoir. Notez cependant que l'implémentation sous-jacente peut avoir un comportement différent. Alors qu'Entity Framework obéit à cela, un O / RM comme LLBLGen peut également revenir
null
lors de l'appel,First
ce qui est une chose très étrange. C'était une décision très étrange (et têtue) de la part du designer IMO.la source
Single
exprime clairement que vous vous attendez à ce que le résultat n'ait qu'un seul élément.Les quatre méthodes ont chacune leur place; Bien que vous n'ayez vraiment que deux opérations différentes.
La version xxxxOrDefault () ajoute simplement "Je ne veux pas considérer un jeu de résultats vide comme une circonstance exceptionnelle."
la source
De l'autre côté, vous pouvez diviser ces méthodes par la logique de base, comme ceci:
Pour quelques détails sur les performances, en particulier dans le second cas, vous pouvez regarder ici: https://msdn.microsoft.com/en-us/data/hh949853.aspx?f=255&MSPPError=-2147217396#3
De plus, dans le premier groupe, vous pouvez définir des requêtes complexes, mais avec la méthode Find () , vous ne pouvez fournir qu'une clé d'entité pour la recherche.
la source
Single () et SingleOrDefault () sont généralement utilisés sur des identificateurs uniques tels que les ID, tandis que First () ou FirstOrDefault () est généralement utilisé pour une requête qui pourrait avoir plusieurs résultats mais que vous ne voulez que "Top 1" .
Single () ou First () lèverait une exception si aucun résultat n'est renvoyé, SingleOrDefault () et FirstOrDefault () intercepte l'exception et renvoie null ou par défaut (ResultDataType).
la source