132 votes

Entity Framework 4 Single () vs Premier () vs FirstOrDefault ()

J'ai du mal à trouver une comparaison des différentes façons d'interroger un seul élément et à quel moment utiliser chacune d'elles.

Quelqu'un at-il un lien qui compare tous ces éléments ou une explication rapide de la raison pour laquelle vous utiliseriez l'un sur l'autre? Y a-t-il encore d'autres opérateurs que je ne sache pas?

Je vous remercie.

221voto

Steve Willcock Points 11859

Voici un aperçu des différentes méthodes:

  • Find() - lorsque vous voulez obtenir un élément clé primaire. Elle retourne la valeur null si il ne peut pas trouver un article. Il va chercher dans le contexte avant d'aller à la base de données (comme l'a souligné par Yaron dans les commentaires) qui peut être un important facteur d'efficacité si vous avez besoin pour obtenir la même entité plusieurs fois pendant le même contexte est vivant.

  • Unique (le) - quand vous vous attendez d'un élément à être renvoyées par une requête. Cela permettra de lever une exception si la requête ne renvoie pas exactement un seul élément.

  • SingleOrDefault() - quand vous vous attendez à zéro ou un, les articles doivent être retournés par une requête (c'est à dire que vous n'êtes pas sûr si un élément avec une clé existe). Cela permettra de lever une exception si la requête ne retourne pas de zéro ou de l'un des éléments.

  • (Première) - quand vous vous attendez à un ou plusieurs éléments doivent être retournés par une requête, mais vous ne voulez accéder au premier élément dans votre code (commande pourrait être important dans la requête ici). Cela permettra de lever une exception si la requête ne renvoie pas au moins un article.

  • FirstOrDefault() - quand vous vous attendez à zéro ou plusieurs éléments doivent être retournés par une requête, mais vous ne voulez accéder au premier élément dans votre code (c'est à dire que vous n'êtes pas sûr si un élément avec une clé existe)

26voto

zeeshanhirani Points 1789

J'ai toujours tendance à utiliser FirstOrDefault. Si vous voulez vraiment être sélectif en termes de performances, vous devez utiliser FirstOrDefault dans EF. Sous les couvertures, SingleOrDefault utilise top (2) dans la requête, car il doit vérifier s'il existe une deuxième ligne correspondant aux critères et, le cas échéant, il lève une exception. Fondamentalement, dans SingleOrDefault, vous dites que vous voulez créer une exception si votre requête renvoie plus d'un enregistrement.

16voto

Steven Points 56939

C'est vraiment très simple: Single renvoie un seul élément et de lever une exception si il n'y a aucun ou plus d'un élément. First retourner le premier élément ou de le jeter quand il n'y a pas d'objet. FirstOrDefault retourner le premier élément ou de retourner à la valeur par défaut (qui est - null dans le cas où le type est un type de référence) quand il n'y a pas d'objet.

C'est le comportement de l'API est censé avoir. Notez cependant que le sous-jacent de la mise en œuvre pourrait avoir un comportement différent. Alors que Entity Framework obéit à cela, un O/RM comme LLBLGen peut également renvoyer null lors de l'appel d' First ce qui est une chose très étrange. C'était très étrange (et têtu) décision prise par le concepteur de l'OMI.

8voto

Chris Shaffer Points 18066

Les quatre méthodes ont chacune leur place; Bien que vous n'ayez vraiment que deux opérations différentes.

  • Premier - Attendez-vous à un ensemble de résultats contenant plusieurs éléments, donnez-moi le premier élément de cet ensemble.
  • Simple - Si vous attendez un seul résultat, donnez-moi cet objet.

La version xxxxOrDefault () ajoute simplement "Je ne veux pas considérer un jeu de résultats vide comme une circonstance exceptionnelle."

0voto

MilkTea027 Points 40

Unique() et SingleOrDefault() est généralement utilisé sur les identificateurs uniques comme des Identifiants, tandis que la Première() ou FirstOrDefault() est généralement utilisé pour une requête qui peut avoir de multiples résultat, mais vous voulez seulement le "Top 1".

Unique (le) ou un (Premier) permettrait de lever une exception si aucun résultat n'est retourné, SingleOrDefault() et FirstOrDefault() intercepte l'exception et renvoie la valeur null ou par défaut(ResultDataType).

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