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

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

Quelqu’un at-il un lien qui compare tout cela, ou une explication rapide de la raison pour laquelle vous utiliseriez l’un sur l’autre? Y a-t-il encore plus d’opérateurs que je ne connais pas?

Je vous remercie.

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

  • Find () – lorsque vous souhaitez obtenir un élément par clé primaire. Cela retournera null s’il ne peut pas trouver un élément. Il va chercher dans le contexte avant d’aller dans la firebase database (comme indiqué par Yaron dans les commentaires), ce qui peut être un facteur d’efficacité important si vous devez obtenir plusieurs fois la même entité alors que le même contexte est actif.

  • Single () – Lorsque vous attendez exactement un élément par une requête. Cela provoquera une exception si la requête ne renvoie pas exactement un élément.

  • SingleOrDefault () – lorsque vous attendez que zéro ou un élément soit renvoyé par une requête (c.-à-d. Que vous ne savez pas si un élément avec une clé donnée existe). Cela lancera une exception si la requête ne renvoie pas zéro ou un élément.

  • First () – lorsque vous attendez 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 lancera une exception si la requête ne renvoie pas au moins un élément.

  • FirstOrDefault () – lorsque vous attendez zéro requête ou plus pour une requête, mais que vous ne souhaitez accéder qu’au premier élément de votre code (vous n’êtes pas sûr qu’un élément avec une clé donnée existe)

J’ai toujours tendance à utiliser FirstOrDefault. Si vous voulez vraiment être difficile avec les performances, vous devez utiliser FirstOrDefault dans EF. Dans les couvertures, SingleOrDefault utilise top (2) dans la requête car il doit vérifier si une deuxième ligne correspond aux critères et si c’est le cas, elle génère une exception. Fondamentalement, dans SingleOrDefault, vous dites qu’il convient de lancer une exception si votre requête renvoie plus d’un enregistrement.

C’est vraiment très simple: Single renvoie un seul élément et lance une exception s’il n’y en a aucun ou plus d’un. First retourne le premier object ou le jette quand il n’y a pas d’article. FirstOrDefault renverra le premier élément ou renverra la valeur par défaut (qui est null si le type donné est un type de référence) lorsqu’il n’y a pas d’élément.

C’est le comportement que l’API est censé 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 renvoyer null lorsqu’il appelle First ce qui est très étrange. C’était une décision très étrange (et têtue) du concepteur IMO.

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

  • Premièrement – Attendez-vous à un jeu de résultats contenant plusieurs éléments, donnez-moi le premier élément de cet ensemble.
  • Single – S’attendant à un seul résultat, donnez-moi cet article.

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

De l’autre côté, vous pouvez diviser ces méthodes par la logique de base, comme ceci:

  • La méthode interrogera directement la firebase database : Single (), SingleOrDefault (), First (), FirstOrDefault ()
  • Method effectuera une recherche dans le cache avant même d’émettre la requête sur la firebase database : Find ()

Pour plus de 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 que la clé d’entité pour la recherche.

Single () et SingleOrDefault () sont généralement utilisés sur des identificateurs uniques tels que les identifiants, tandis que First () ou FirstOrDefault () est généralement utilisé pour une requête pouvant avoir plusieurs résultats, mais que vous ne souhaitez que le “Top 1” .

Single () ou First () émet une exception si aucun résultat n’est renvoyé, SingleOrDefault () et FirstOrDefault () intercepte l’exception et renvoie null ou default (ResultDataType).