J'ai cherché et n'ai pas vraiment trouvé de réponse claire quant au moment où vous souhaitez utiliser .First
et quand vous souhaitez utiliser .FirstOrDefault
avec LINQ.
Quand voudriez-vous l'utiliser
.First
? Uniquement lorsque vous souhaitez intercepter l'exception si aucun résultat n'est renvoyé?var result = List.Where(x => x == "foo").First();
Et quand voudriez-vous l'utiliser
.FirstOrDefault
? Quand 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);
.First
et les.FirstOrDefault
deux prennent des prédicats comme arguments, doncvar result = List.Where(x => x == "foo").First();
pourraient être réécrits commevar result = List.First(x => x == "foo");
Single
etSingleOrDefault
. Je déteste quand les gens utilisentFirst
quand ils veulent vraiment direSingle
; ).FirstOrDefault()
vous donne toujours la possibilité de lever une exception plus significative. Si une exception de séquence est levée et plusieurs.First()
dans une méthode, il peut être difficile de discerner quelle instruction est le problème.Réponses:
J'utiliserais
First()
quand je connais ou que je m'attends à ce que la séquence ait au moins un élément. En d'autres termes, lorsque c'est une occurrence exceptionnelle que la séquence est vide.À utiliser
FirstOrDefault()
lorsque vous savez que vous devrez vérifier s'il y a un élément ou non. En d'autres termes, quand il est légal que la séquence soit vide. Vous ne devez pas vous fier à la gestion des exceptions pour la vérification. (C'est une mauvaise pratique et peut nuire aux performances).Enfin, la différence entre
First()
etTake(1)
est queFirst()
renvoie l'élément lui-même, tandis queTake(1)
renvoie une séquence d'éléments qui contient exactement un élément.la source
.First
lèvera une exception lorsqu'il n'y a aucun résultat..FirstOrDefault
ne le fera pas, il retournera simplement null (types de référence) ou la valeur par défaut du type de valeur. (par exemple comme0
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? Étant donné que les exceptions doivent être exceptionnelles, ilFirstOrDefault
est préférable de ne pas être sûr d'obtenir des résultats de votre requête. Lorsque, logiquement, les données doivent être présentes, la gestion des exceptions peut être envisagée.Skip()
etTake()
sont normalement utilisés lors de la configuration de la pagination dans les résultats. (Comme afficher les 10 premiers résultats et les 10 suivants sur la page suivante, etc.)J'espère que cela t'aides.
la source
.FirstOrDefault
renverra null pour les types de référence. J'étais confus quant à ce que serait un objet "par défaut". Cette réponse a clarifié cela..First()
générera une exception s'il n'y a pas de ligne à renvoyer, tandis que.FirstOrDefault()
retournera la valeur par défaut (NULL
pour tous les types de référence) à la place.Donc, si vous êtes prêt et disposé à gérer une éventuelle exception, ça
.First()
va. Si vous préférez!= null
quand même vérifier la valeur de retour ,.FirstOrDefault()
c'est votre meilleur choix.Mais je suppose que c'est aussi une préférence personnelle. Utilisez celui qui vous convient le mieux et correspond mieux à votre style de codage.
la source
Première()
FirstOrDefault ()
Nous avons une table UserInfos, qui a quelques enregistrements comme indiqué ci-dessous. Sur la base de ce tableau ci-dessous, j'ai créé un exemple ...
Comment utiliser First ()
Il n'y a qu'un seul enregistrement où ID == 1. Doit renvoyer cet enregistrement
ID: 1 Prénom: Manish Nom de famille: Dubey Courriel: [email protected]
Il existe plusieurs enregistrements où FName == "Rahul". Le premier enregistrement doit être de retour.
ID: 7 Prénom: Rahul Nom: Sharma Courriel: [email protected]
Il n'y a aucun enregistrement avec l'ID == 13. Une erreur doit se produire.
InvalidOperationException: la séquence ne contient aucun élément
Comment utiliser FirstOrDefault ()
Il n'y a qu'un seul enregistrement où ID == 1. Doit renvoyer cet enregistrement
ID: 1 Prénom: Manish Nom de famille: Dubey Courriel: [email protected]
Il existe plusieurs enregistrements où FName == "Rahul". Le premier enregistrement doit être de retour.
ID: 7 Prénom: Rahul Nom: Sharma Courriel: [email protected]
Il n'y a pas d'enregistrement avec l'ID == 13. La valeur de retour est nulle
J'espère que cela vous aidera à comprendre quand utiliser
First()
ouFirstOrDefault()
.la source
Tout d'abord,
Take
c'est une méthode complètement différente. Il renvoie unIEnumerable<T>
et pas un seulT
, donc c'est sorti.Entre
First
etFirstOrDefault
, vous devez utiliserFirst
lorsque vous êtes sûr qu'un élément existe et si ce n'est pas le cas, il y a une erreur.Soit dit en passant, si votre séquence contient des
default(T)
éléments (par exemplenull
) et que vous devez faire la distinction entre être vide et le premier élément étantnull
, vous ne pouvez pas utiliserFirstOrDefault
.la source
Première:
FirstOrDefault:
De: http://www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-firstordefault/
la source
Une autre différence à noter est que si vous déboguez une application dans un environnement de production, vous n'aurez peut-être pas accès aux numéros de ligne, il
.First()
peut donc être difficile d' identifier quelle instruction particulière dans une méthode a levé l'exception.Le message d'exception n'inclura pas non plus d'expressions Lambda que vous auriez pu utiliser, ce qui rendrait tout problème encore 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.la source
Première()
Lorsque vous savez que le résultat contient plus d'un élément attendu et que vous ne devez que le premier élément de la séquence.
FirstOrDefault ()
FirstOrDefault () est similaire à First () sauf que, si aucun élément ne correspond à la condition spécifiée, il renvoie la valeur par défaut du type sous-jacent de collection générique. Il ne lève pas InvalidOperationException si aucun élément n'a été trouvé. Mais la collection d'un élément ou d'une séquence est nulle car elle lève une exception.
la source
Ce type de fonction appartient aux opérateurs d'éléments. Certains opérateurs d'éléments utiles sont définis ci-dessous.
Nous utilisons des opérateurs d'éléments lorsque nous devons sélectionner un seul élément dans une séquence en fonction d'une certaine condition. Voici un exemple.
L'opérateur First () renvoie le premier élément d'une séquence après avoir satisfait à la condition. Si aucun élément n'est trouvé, il lèvera une exception.
int result = items.Where (item => item == 2) .First ();
L'opérateur FirstOrDefault () renvoie le premier élément d'une séquence après avoir satisfait à la condition. Si aucun élément n'est trouvé, il retournera la valeur par défaut de ce type.
int result1 = items.Where (item => item == 2) .FirstOrDefault ();
la source
J'ai trouvé un site Web qui apparait pour expliquer la nécessité 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 souhaitez appeler d'abord () ou Single () pour obtenir une seule ligne ... Vous obtiendrez une exception "La séquence ne contient aucun élément".
Avis de non-responsabilité: Je n'ai jamais utilisé LINQ, donc mes excuses si c'est loin de la marque.
la source
Lequel utiliser? Elle doit être décidée par la logique métier, et non par la crainte d'une défaillance d'exception / programme.
Par exemple, si la logique métier dit que nous ne pouvons avoir aucune transaction aucun jour ouvrable (supposons simplement). Ensuite, vous ne devriez pas essayer de gérer ce scénario avec une programmation intelligente. J'utiliserai toujours First () sur une telle collection et laisserai le programme échouer si quelque chose d'autre a foiré la logique métier.
Code:
J'aimerais voir d'autres commentaires à ce sujet.
la source
Ok, laissez-moi donner mes deux cents. First / Firstordefault sont pour quand vous utilisez le deuxième constructeur. Je n'expliquerai pas ce que c'est, mais c'est quand vous pourriez potentiellement toujours en utiliser un parce que vous ne voulez pas provoquer d'exception.
la source
D'autres ont très bien décrit la différence entre
First()
etFirstOrDefault()
. Je veux franchir une étape supplémentaire dans l'interprétation de la sémantique de ces méthodes. À mon avis,FirstOrDefault
est beaucoup surutilisé. Dans la majorité des cas, lorsque vous filtrez des données, vous vous attendez à récupérer une collection d'éléments correspondant à la condition logique ou un seul élément unique par son identifiant unique - tel qu'un utilisateur, un livre, une publication, etc. pourquoi nous pouvons même aller jusqu'à dire queFirstOrDefault()
c'est une odeur de code non pas parce qu'il y a quelque chose qui ne va pas mais parce qu'il est utilisé trop souvent. Ce billet de blog explore le sujet en détail. OMI la plupart du tempsSingleOrDefault()
est une bien meilleure alternative, alors faites attention à cette erreur et assurez-vous d'utiliser la méthode la plus appropriée qui représente clairement votre contrat et vos attentes.la source
linq de nombreuses façons d'implémenter une simple requête simple sur des collections, il suffit d'écrire des jointures en sql, un filtre peut être appliqué en premier ou en dernier selon le besoin et la nécessité.
Voici un exemple où nous pouvons trouver un élément avec un id dans une collection. Pour en ajouter plus, les méthodes First
FirstOrDefault
,, devraient idéalement renvoyer la même chose lorsqu'une collection a au moins un enregistrement. Si, cependant, une collection peut être vide. puisFirst
retournera une exception maisFirstOrDefault
reviendranull
ou par défaut. Par exemple,int
retournera 0. Ainsi, l'utilisation de tels est bien que considérée comme une préférence personnelle, mais il vaut mieux l'utiliserFirstOrDefault
pour éviter la gestion des exceptions.la source