2016-03-31 18 views
11

Ho il seguente LINQ in un controllore WebAPI:Prendi la prima data in un'espressione LINQ

MyDate = i.Products.FirstOrDefault().Date 

funziona come previsto. Ma, i prodotti sono una collezione, quindi ci possono essere molte date. Quanto sopra seleziona solo il primo.

Quello che voglio veramente è trovare la data, con la prima ora, e selezionarla.

Come sarebbe quello?

+0

'.FirstOrDefault()' può restituire null. Il tuo codice è vulnerabile a NullReferenceExceptions quando si esegue '.Date'. Rivedi per il caso in cui l'elenco dei prodotti è vuoto. Inoltre, fai attenzione con la risposta che usi, provalo con una lista vuota - lo stesso problema probabilmente esiste lì. – ANeves

risposta

14

Se si desidera solo la data e non l'intero prodotto, è un po 'più chiaro usare Max o Min.

MyDate = i.Products.Select(x => x.Date).Max() 

Se si desidera effettivamente il prodotto, sarà necessario ordinare in base alla data e quindi selezionare il primo.

MyProduct = i.Products.OrderBy(x => x.Date).FirstOrDefault() 
+4

è costosa e non deve essere utilizzata quando non è necessaria. La query per il prodotto con la data meno recente potrebbe essere scritta come 'Product oldestProduct = i.Products.SingleOrDefault (x => x.Date == i.Products.Min (y => y.Date))' 'DateTime minDate = i.Products.Min (x => x.Date); Product oldestProduct = i.Products.SingleOrDefault (x => x.Date == minDate); '** Nota: ** L'ultima versione è più leggibile ma richiede due query separate. –

+2

@ SørenD.Ptæus il costo dell'ordine dipende da come viene effettuato l'ordine. Se accede a un database e c'è un indice ordinato sulla data, sarebbe piuttosto economico. –

+1

Attenzione: facendo '.Max()' o '.Min() 'su una raccolta vuota genererà un'eccezione! – ANeves

1

Semplicemente ordinare per data:

MyDate = i.Products.OrderBy(x => x.Date).Select(x => x.Date).FirstOrDefault(); 
2

È possibile utilizzare

i.Products.OrderByDescending(x => x.Date).FirstOrDefault().Date; 
+0

Questo vi darà la data più recente (più recente) – bit

+0

Non c'è * OrderByAscending * – bit

+0

Sì, ho appena realizzato che l'ordinazione –

1

modo ottimizzato sarebbe:

i.Products.OrderByDescending(x => x.Date).Select(x => x.Date).FirstOrDefault(); 
1
i.Products.OrderBy(x => x.Date).FirstOrDefault().Date; 

Deve essere orderby e non OrderByDescending. orderbydescending ti darà la data più recente prima e l'ordine ti darà la prima data prima.

3

In questo modo è più conciso:

var earlyDate = i.Products.Min(p=>p.Date); 

Ma si è certi che Product != null

2

Ecco un'espressione lambda che vi darà il minimo (prima) Data

DateTime earliestDate = i.Products.Min(p => p.Date); 
1

Semplice , se è necessario utilizzare prima il OrderBy e la necessità è maggiore, utilizzare OrderByDescending.

i.Products.OrderBy(x => x.Date).Select(x => x.Date).FirstOrDefault(); 
i.Products.OrderByDescending(x => x.Date).Select(x => x.Date).FirstOrDefault(); 
Problemi correlati