Question Quand utiliser .FirstOrDefault avec LINQ?


J'ai cherché autour et n'ai pas vraiment trouvé une réponse claire quant à quand vous voudriez utiliser .First et quand vous voudriez utiliser .FirstOrDefault avec LINQ.

  • Quand voudriez-vous utiliser .First? Seulement quand vous voulez attraper l'exception si aucun résultat n'est retourné?

    var result = List.Where(x => x == "foo").First();
    
  • Et quand voudriez-vous utiliser .FirstOrDefault? Lorsque vous voudriez toujours le type par défaut si aucun résultat?

    var result = List.Where(x => x == "foo").FirstOrDefault();
    
  • Et d'ailleurs, qu'en est-il de Take?

    var result = List.Where(x => x == "foo").Take(1);
    

673
2018-06-21 19:15


origine


Réponses:


j'utiliserais First() quand je sais ou attend que la séquence ait au moins un élément. En d'autres termes, lorsqu'il s'agit d'un événement exceptionnel, la séquence est vide.

Utilisation FirstOrDefault() quand vous savez que vous aurez besoin de vérifier s'il y avait un élément ou non. En d'autres termes, quand il est légal que la séquence soit vide. Vous ne devez pas compter sur la gestion des exceptions pour la vérification. (C'est une mauvaise pratique et cela pourrait nuire aux performances).

Enfin, la différence entre First() et Take() est-ce First() renvoie l'élément lui-même, tandis Take() renvoie une séquence d'éléments contenant exactement un élément. (Si vous passez 1 comme paramètre).


681
2018-06-21 19:22



.First va lancer une exception quand il n'y a pas de résultats. .FirstOrDefault ne le fera pas, il retournera simplement soit null (types de référence) ou la valeur par défaut du type de valeur. (par exemple, comme 0 pour un int.) La question ici n'est pas quand vous voulez le type par défaut, mais plus: Êtes-vous prêt à gérer une exception ou gérer une valeur par défaut? Puisque les exceptions devraient être exceptionnelles, FirstOrDefault est préférable lorsque vous n'êtes pas sûr si vous allez obtenir des résultats hors de votre requête. Quand logiquement les données devraient être là, le traitement d'exception peut être considéré.

Skip() et Take() sont normalement utilisés lors de la configuration de la pagination dans les résultats. (Comme montrer les 10 premiers résultats, et les 10 suivants sur la page suivante, etc.)

J'espère que cela t'aides.


224
2018-06-21 19:23



.FirstOrDefault () renverra la valeur par défaut si aucune ligne n'est renvoyée.NULL à la place pour tous les types de référence).

Donc, si vous êtes prêt et disposé à gérer une éventuelle exception, .First() c'est bien. Si vous préférez vérifier la valeur de retour pour! = Null de toute façon, alors .FirstOrDefault() est ton meilleur choix.

Mais je suppose que c'est aussi un peu une préférence personnelle. Utilisez ce qui vous convient le mieux et adapte mieux votre style de codage.


90
2018-06-21 19:22



Premier() 

  1. Renvoie le premier élément d'une séquence.
  2. Il lance une erreur quand Il n'y a pas d'élément dans le résultat ou la source est nulle.
  3. vous devriez l'utiliser, Si plus d'un élément est attendu et vous voulez seulement le premier élément.

FirstOrDefault () 

  1. Renvoie le premier élément d'une séquence ou une valeur par défaut si aucun élément n'est trouvé.
  2. Il lance une erreur Seulement si la source est nulle.
  3. vous devriez l'utiliser, Si plus d'un élément est attendu et vous voulez seulement le premier élément. Aussi bien si le résultat est vide.

Nous avons une table UserInfos, qui a des enregistrements comme indiqué ci-dessous. Sur la base de ce tableau ci-dessous j'ai créé l'exemple ...

UserInfo Table

Comment utiliser First ()

var result = dc.UserInfos.First(x => x.ID == 1);

Il n'y a qu'un seul enregistrement où ID == 1. Devrait retourner cet enregistrement
ID: 1 Prénom: Manish Nom: Dubey Email: xyz@xyz.com

var result = dc.UserInfos.First(x => x.FName == "Rahul");   

Il existe plusieurs enregistrements où FName == "Rahul". Le premier enregistrement devrait être le retour.
ID: 7 Prénom: Rahul Nom de famille: Sharma Email: xyz1@xyz.com

var result = dc.UserInfos.First(x => x.ID ==13);

Il n'y a pas d'enregistrement avec ID == 13. Une erreur devrait se produire.
InvalidOperationException: la séquence ne contient aucun élément

Comment utiliser FirstOrDefault ()

var result = dc.UserInfos.FirstOrDefault(x => x.ID == 1);

Il n'y a qu'un seul enregistrement où ID == 1. Devrait retourner cet enregistrement
ID: 1 Prénom: Manish Nom: Dubey Email: xyz@xyz.com

var result = dc.UserInfos.FirstOrDefault(x => x.FName == "Rahul");

Il existe plusieurs enregistrements où FName == "Rahul". Le premier enregistrement devrait être le retour.
ID: 7 Prénom: Rahul Nom de famille: Sharma Email: xyz1@xyz.com

var result = dc.UserInfos.FirstOrDefault(x => x.ID ==13);

Il n'y a aucun enregistrement avec ID == 13. La valeur de retour est null

J'espère que cela vous aidera à comprendre quand utiliser First() ou FirstOrDefault().


54
2017-09-02 05:35



Tout d'abord, Take est une méthode complètement différente. Il renvoie un IEnumerable<T> et pas un seul T, donc c'est fini.

Entre First et FirstOrDefault, Tu devrais utiliser First quand vous êtes sûr qu'un élément existe et si ce n'est pas le cas, il y a une erreur.

En passant, si votre séquence contient default(T) éléments (par ex. null) et vous devez faire la distinction entre être vide et le premier élément étant null, vous ne pouvez pas utiliser FirstOrDefault.


17
2018-06-21 19:23



Premier:

  • Renvoie le premier élément d'une séquence
  • Lève exception: Il n'y a pas d'éléments dans le résultat
  • Utiliser quand: Lorsque plus d'un élément est attendu et que vous ne voulez que le premier

FirstOrDefault:

  • Renvoie le premier élément d'une séquence ou une valeur par défaut si aucun élément n'est trouvé
  • Lève exception: Seulement si la source est nulle
  • Utiliser quand: Quand plus d'un élément est attendu et que vous voulez seulement le premier. Aussi, il est bon que le résultat soit vide

De: http://www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-firstordefault/


13
2018-04-04 14:29



Une autre différence à noter est que si vous déboguez une application dans un environnement de production, vous n'avez peut-être pas accès aux numéros de ligne. .First() déclaration dans une méthode a jeté l'exception peut être difficile.

Le message d'exception n'inclura pas non plus les expressions Lambda que vous auriez pu utiliser, ce qui rendrait tout problème même plus difficile à déboguer.

C'est pourquoi j'utilise toujours FirstOrDefault() même si je sais qu'une entrée nulle constituerait une situation exceptionnelle.

var customer = context.Customers.FirstOrDefault(i => i.Id == customerId);
if (customer == null)
{
   throw new Exception(string.Format("Can't find customer {0}.", customerId));
}

6
2017-09-17 00:50



J'ai trouvé un site Web qui permet d'expliquer le besoin de FirstOrDefault
http://thepursuitofalife.com/the-linq-firstordefault-method-and-null-resultsets/
S'il n'y a aucun résultat à une requête, et que vous voulez appeler First () ou Single () pour obtenir une seule ligne ... Vous obtiendrez une exception "Sequence contains no elements".

Disclaimer: Je n'ai jamais utilisé LINQ, alors mes excuses si c'est loin de la réalité.


3
2018-06-21 19:24