c# tutorial - Quando utilizzare.Prima e quando utilizzare.FirstOrDefault con LINQ?




api methods (13)

Ho cercato in giro e non ho ancora trovato una risposta chiara su quando avresti voluto utilizzare. .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);
    

Answers

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 a una determinata condizione. Ecco un 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, verrà generata 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 ();


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.


.First () genererà un'eccezione se non è presente alcuna riga da restituire, mentre .FirstOrDefault () restituirà il valore predefinito ( NULL per tutti i tipi di riferimento).

Quindi, se sei preparato e disposto a gestire una possibile eccezione, .First() va bene. Se si preferisce controllare comunque il valore restituito per! = Null, .FirstOrDefault() è la scelta migliore.

Ma immagino sia anche un po 'una preferenza personale. Usa quello che ha più senso per te e si adatta meglio al tuo stile di codifica.


Un'altra differenza da notare è che se esegui il debug di un'applicazione in un ambiente di produzione potresti non avere accesso ai numeri di riga, quindi identificare quale particolare .First() in un metodo ha .First() l'eccezione potrebbe essere difficile.

Il messaggio di eccezione non includerà anche le espressioni Lambda che potresti aver utilizzato, il che renderebbe qualsiasi problema anche più difficile da eseguire il debug.

Ecco perché utilizzo sempre FirstOrDefault() anche se so che una voce nulla costituirebbe una situazione eccezionale.

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

Prima di tutto, Take è un metodo completamente diverso. Restituisce un IEnumerable<T> e non un singolo T , quindi è fuori.

Tra First e FirstOrDefault , dovresti usare First quando sei sicuro che esista un elemento e, in caso contrario, c'è un errore.

A proposito, se la sequenza contiene elementi default(T) (ad es. null ) e devi distinguere tra essere vuoto e il primo elemento essere null , non puoi utilizzare FirstOrDefault .


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.


Ok lasciami dare i miei due centesimi. First / Firstordefault sono per quando si utilizza il secondo costruttore. Non spiegherò di cosa si tratta, ma è quando ne utilizzeresti potenzialmente sempre uno perché non vuoi causare un'eccezione.

person = tmp.FirstOrDefault(new Func<Person, bool>((p) =>
{
    return string.IsNullOrEmpty(p.Relationship);
}));

.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 10 successivo nella pagina successiva, ecc.)

Spero che questo ti aiuti.


Primo()

  1. Restituisce il primo elemento di una sequenza.
  2. Segnala un errore quando non ci sono elementi nel risultato o la fonte è 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: [email protected]

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: [email protected]

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: [email protected]

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: [email protected]

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() .


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/



Scala.Ora ho letto e l'ho trovato come linq ma più semplice e più illeggibile. ma scala può funzionare su Linux, sì? csharp ha bisogno di mono.





c# .net linq