2012-06-04 12 views
36

Sto utilizzando Linq/EF4.1 per estrarre alcuni risultati da un database e vorrei limitare i risultati ai (X) risultati più recenti. Dove X è un numero impostato dall'utente.Numero limite di risultati restituiti in un elenco da Linq

C'è un modo per farlo?

Attualmente sto passandole indietro come List se questo aiuterà a limitare il set di risultati. Mentre posso limitare questo looping fino a quando non premo X, suppongo solo di non passare i dati extra in giro.

Nel caso in cui sia rilevante ... Progetto C# MVC3 eseguito da un database SQL Server.

+3

stai chiedendo per linq "take (100)"? – daryal

risposta

69

utilizzare la funzione

int numberOfrecords=10; // read from user 
listOfItems.OrderByDescending(x => x.CreatedDate).Take(numberOfrecords) 

Take Supponendo listOfItems è la lista dei tuoi oggetti entità e CreatedDate è un campo che ha il valore creato data (usato qui a fare l'Ordine scendendo per ottenere elementi più recenti).

Take() restituisce un numero specificato di elementi contigui dall'inizio di una sequenza .

http://msdn.microsoft.com/en-us/library/bb503062.aspx

+1

"risultati più recenti" - che non è indirizzato dalla tua risposta. –

+0

@ Mr.TA: Ah! Ho perso quella parte. Aggiornato ora. Grazie per la segnalazione. – Shyju

+1

Anche se non avevo davvero bisogno di aiuto con la porzione più recente (ho formulato la domanda in modo insufficiente) il take è quello di cui avevo bisogno! Grazie! – Jared

17
results = results.OrderByDescending(x=>x.Date).Take(10); 

L'OrderByDescending ordinerà articoli per la vostra proprietà di data/ora (o/e logica w che si desidera utilizzare per ottenere più recente) e Take limiterà agli elementi primi x (prima essendo più recente, grazie all'ordine).

Edit: Per tornare alcune righe che non iniziano alla prima riga, utilizzare Skip():

results = results.OrderByDescending(x=>x.Date).Skip(50).Take(10); 
+1

È possibile prendere risultati a partire da un indice? Ad esempio, un centinaio di risultati - inizia con l'indice 50, prendi 10 risultati, da 50 a 60? – FrenkyB

+2

@FrenkyB per favore vedi la risposta - L'ho aggiornata per indirizzare il tuo follow-up. –

+0

Meraviglioso, grazie mille :) – FrenkyB

10

Usa Take(), prima della conversione a un elenco. In questo modo EF può ottimizzare la query creata e restituire solo i dati necessari.

+1

Vuoi gentilmente elaborare di più. Forse con un esempio? –

+1

@ W.M. L'utilizzo di Take per primo consentirà a EF di eseguire correttamente il paging nella query SQL. Se invece si esegue ToList, tutti i risultati verranno ritirati da SQL e il paging verrà quindi eseguito in memoria. – RedFilter

Problemi correlati