[c#] Quando utilizzare. Prima e quando utilizzare .FirstOrDefault con LINQ?



6 Answers

.First genererà un'eccezione quando non ci sono risultati. .FirstOrDefault no, restituirà semplicemente null (tipi di riferimento) o il valore predefinito del tipo di valore. (ad esempio, come 0 per un int.) La domanda qui non è quando si desidera il tipo predefinito, ma più: siete disposti a gestire un'eccezione o gestire un valore predefinito? Poiché le eccezioni dovrebbero essere eccezionali, FirstOrDefault è preferito quando non si è sicuri se si otterranno risultati dalla query. Quando logicamente i dati dovrebbero essere lì, può essere presa in considerazione la gestione delle eccezioni.

Skip() e Take() vengono normalmente utilizzati durante l'impostazione del paging nei risultati. (Come mostrare i primi 10 risultati, e il prossimo 10 nella pagina successiva, ecc.)

Spero che questo ti aiuti.

Question

Ho cercato in giro e non ho ancora trovato una risposta chiara su quando avresti voluto usare. .First e quando avresti voluto usare .FirstOrDefault con LINQ.

  • Quando vorresti usare .First ? Solo quando vuoi recuperare l'eccezione se non vengono restituiti risultati?

    var result = List.Where(x => x == "foo").First();
    
  • E quando vorresti usare .FirstOrDefault ? Quando vuoi sempre il tipo predefinito se nessun risultato?

    var result = List.Where(x => x == "foo").FirstOrDefault();
    
  • E del resto, per quanto riguarda Take?

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



Questo tipo di funzione appartiene agli operatori di elementi. Alcuni operatori di elementi utili sono definiti di seguito.

  1. In primo luogo / FirstOrDefault
  2. Ultima / LastOrDefault
  3. Singolo / SingleOrDefault

Utilizziamo gli operatori di elementi quando è necessario selezionare un singolo elemento da una sequenza in base alla determinata condizione. Ecco l'esempio.

  List<int> items = new List<int>() { 8, 5, 2, 4, 2, 6, 9,2,10};

L'operatore first () restituisce il primo elemento di una sequenza dopo aver soddisfatto la condizione. Se non viene trovato alcun elemento, avverrà tramite un'eccezione.

int result = items.Where (item => item == 2) .First ();

L'operatore FirstOrDefault () restituisce il primo elemento di una sequenza dopo aver soddisfatto la condizione. Se non viene trovato alcun elemento, restituirà il valore predefinito di quel tipo.

int result1 = items.Where (item => item == 2) .FirstOrDefault ();




Primo:

  • Restituisce il primo elemento di una sequenza
  • Genera eccezione: non ci sono elementi nel risultato
  • Usa quando: Quando è previsto più di 1 elemento e vuoi solo il primo

FirstOrDefault:

  • Restituisce il primo elemento di una sequenza o un valore predefinito se non viene trovato alcun elemento
  • Genera eccezione: solo se la fonte è nullo
  • Usa quando: Quando è previsto più di 1 elemento e vuoi solo il primo. Inoltre va bene che il risultato sia vuoto

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




Primo()

  1. Restituisce il primo elemento di una sequenza.
  2. Segnala un errore quando non ci sono elementi nel risultato o la sorgente è nulla.
  3. dovresti usarlo, se è previsto più di un elemento e vuoi solo il primo elemento.

FirstOrDefault ()

  1. Restituisce il primo elemento di una sequenza o un valore predefinito se non viene trovato alcun elemento.
  2. Genera un errore Solo se la fonte è nullo.
  3. dovresti usarlo, se è previsto più di un elemento e vuoi solo il primo elemento. Buono anche se il risultato è vuoto.

Abbiamo una tabella UserInfos, che ha alcuni record come mostrato di seguito. Sulla base di questa tabella di seguito ho creato un esempio ...

Come usare First ()

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

C'è solo un record in cui ID == 1. dovrebbe restituire questo record
ID: 1 Nome: Manish Cognome: Dubey Email: xyz@xyz.com

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

Esistono più record in cui FName == "Rahul". Il primo record dovrebbe essere restituito.
ID: 7 Nome: Rahul Cognome: Sharma Email: xyz1@xyz.com

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

Non c'è nessun record con ID == 13. Dovrebbe verificarsi un errore.
InvalidOperationException: la sequenza non contiene elementi

Come utilizzare FirstOrDefault ()

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

C'è solo un record in cui ID == 1. dovrebbe restituire questo record
ID: 1 Nome: Manish Cognome: Dubey Email: xyz@xyz.com

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

Esistono più record in cui FName == "Rahul". Il primo record dovrebbe essere restituito.
ID: 7 Nome: Rahul Cognome: Sharma Email: xyz1@xyz.com

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

Non esiste alcun record con ID == 13. Il valore restituito è nullo

Spero che ti aiuterà a capire quando usare First() o FirstOrDefault() .




Ho trovato un sito Web che si avvicina per spiegare la necessità di FirstOrDefault
http://thepursuitofalife.com/the-linq-firstordefault-method-and-null-resultsets/
Se non ci sono risultati in una query e si desidera chiamare First () o Single () per ottenere una singola riga ... Si otterrà un'eccezione "Sequence contains no elements".

Disclaimer: Non ho mai usato LINQ, quindi mi scuso se questo è lontano dal marchio.




linq molti modi per implementare una singola query semplice su collezioni, solo scrivendo join in sql, un filtro può essere applicato prima o dopo a seconda delle necessità e delle necessità.

Ecco un esempio in cui possiamo trovare un elemento con un ID in una raccolta. Per aggiungere altro, i metodi First, FirstOrDefault , restituiscono idealmente lo stesso quando una raccolta ha almeno un record. Se, tuttavia, una raccolta è a posto vuota. quindi First restituirà un'eccezione ma FirstOrDefault restituirà null o default. Ad esempio, int restituirà 0. Quindi l'utilizzo di tale è anche se si dice che sia una preferenza personale, ma è meglio usare FirstOrDefault per evitare la gestione delle eccezioni.




Primo()

Quando sai che il risultato contiene più di 1 elemento previsto e dovresti solo il primo elemento della sequenza.

FirstOrDefault ()

FirstOrDefault () è come First () tranne che, se nessun elemento corrisponde alla condizione specificata, restituisce il valore predefinito del tipo sottostante della raccolta generica. Non getta InvalidOperationException se non è stato trovato alcun elemento. Ma la raccolta di un elemento o di una sequenza è nullo di quanto non faccia un'eccezione.




Related



Tags

c# c#   .net .net   linq