Query LINQ per selezionare i primi cinque


234

Ho una query LINQ:

var list = from t in ctn.Items
           where t.DeliverySelection == true && t.Delivery.SentForDelivery == null
           orderby t.Delivery.SubmissionDate
           select t;

Come posso modificare questa query per selezionare solo cinque risultati dal database?


Take (how_many_you_wish)
snr

Risposte:


437
var list = (from t in ctn.Items
           where t.DeliverySelection == true && t.Delivery.SentForDelivery == null
           orderby t.Delivery.SubmissionDate
           select t).Take(5);

5
+1, ma gah, racchiudendo le espressioni multilinea tra parentesi e poi de-referenziando l'intero lotto mi gratta davvero per qualche motivo.
Dottore Jones,

6
Questo sembra prendere tanti risultati dal database quanti corrispondono alle condizioni di uguaglianza e solo dopo che sono stati presi dal database applica la restrizione take (5) all'interno dell'applicazione. C'è un modo per letteralmente takesolo le prime 5 righe dal database?
JM Hicks,

6
@JMHicks non proprio. Il comando Take (5) aggiunge solo un'altra condizione a IQueryable, che non verrà eseguita fino a quando non viene enumerata. Tuttavia, potrebbero esserci provider LINQ che non supportano l'operazione Take.
Bruno Brant,

1
@JMHicks - non è così che funziona linq ... linq è pigro.
Hogan,

39

La soluzione:

var list = (from t in ctn.Items
           where t.DeliverySelection == true && t.Delivery.SentForDelivery == null
           orderby t.Delivery.SubmissionDate
           select t).Take(5);

19

Ciò può essere ottenuto anche usando l'approccio basato su Lambda di Linq;

var list = ctn.Items
.Where(t=> t.DeliverySelection == true && t.Delivery.SentForDelivery == null)
.OrderBy(t => t.Delivery.SubmissionDate)
.Take(5);

8

[Offrendo una risposta un po 'più descrittiva rispetto alla risposta fornita da @Ajni .]

Ciò può essere ottenuto anche utilizzando la sintassi fluida LINQ :

var list = ctn.Items
    .Where(t=> t.DeliverySelection == true && t.Delivery.SentForDelivery == null)
    .OrderBy(t => t.Delivery.SubmissionDate)
    .Take(5);

Si noti che ogni metodo ( Where, OrderBy, Take) che compare in questa dichiarazione LINQ prende un'espressione lambda come argomento. Si noti inoltre che la documentazione per Enumerable.Takeinizia con:

Restituisce un numero specificato di elementi contigui dall'inizio di una sequenza.


5

Additional information

A volte è necessario associare un modello a una vista modelli e dare un errore di conversione del tipo . In questa situazione dovresti usare il ToList()metodo.

var list = (from t in ctn.Items
       where t.DeliverySelection == true && t.Delivery.SentForDelivery == null
       orderby t.Delivery.SubmissionDate
       select t).Take(5).ToList();

0

Solo pensando che potresti non avere familiarità con la sequenza Da-> Dove-> Seleziona, come nello script sql, è come Seleziona-> Da-> Dove.

Ma potresti non sapere che all'interno di Sql Engine, è anche analizzato nella sequenza di ' Da-> Dove-> Seleziona ', Per convalidarlo, puoi provare un semplice script

select id as i from table where i=3

e non funzionerà, il motivo è che il motore analizzerà Where before Select , quindi non saprà alias i in where . Per farlo funzionare, puoi provare

select * from (select id as i from table) as t where i = 3
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.