Consulta LINQ para seleccionar los cinco primeros

234

Tengo una consulta LINQ:

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

¿Cómo puedo modificar esta consulta para seleccionar solo cinco resultados de la base de datos?

109221793
fuente
Take (how_many_you_wish)
snr

Respuestas:

437
var list = (from t in ctn.Items
           where t.DeliverySelection == true && t.Delivery.SentForDelivery == null
           orderby t.Delivery.SubmissionDate
           select t).Take(5);
Gidon
fuente
55
+1, pero gah, envolver expresiones de líneas múltiples entre paréntesis y luego desreferenciar todo el lote realmente me irrita por alguna razón.
Doctor Jones
66
Esto parece tomar tantos resultados de la base de datos como coincide con las condiciones de igualdad, y solo después de que se toman de la base de datos se aplica la restricción take (5) dentro de la aplicación. ¿Hay alguna manera de literalmente takesolo las primeras 5 filas de la base de datos?
JM Hicks
66
@JMHicks no realmente. El comando Take (5) solo agrega otra condición a IQueryable, que no se ejecutará hasta que lo enumere. Sin embargo, puede haber proveedores de LINQ que no admitan la operación Take.
Bruno Brant
1
@JMHicks: esa no es la forma en que funciona linq ... linq es vago.
Hogan
39

La solución:

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

Esto también se puede lograr utilizando el enfoque basado en Lambda de Linq;

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

[Ofreciendo una respuesta algo más descriptiva que la respuesta proporcionada por @Ajni .]

Esto también se puede lograr utilizando la sintaxis fluida de LINQ :

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

Tenga en cuenta que cada método ( Where, OrderBy, Take) que aparece en esta declaración de LINQ toma una expresión lambda como argumento. También tenga en cuenta que la documentación para Enumerable.Takecomienza con:

Devuelve un número especificado de elementos contiguos desde el inicio de una secuencia.

DavidRR
fuente
5

Additional information

A veces es necesario vincular un modelo a una vista de modelos y dar un error de conversión de tipo . En esta situación, debe usar el ToList()método.

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

Solo pensando que podría no estar familiarizado con la secuencia From-> Where-> Select, como en el script sql, es como Select-> From-> Where.

Pero es posible que no sepa que dentro de Sql Engine, también se analiza en la secuencia de ' Desde-> Dónde-> Seleccionar ', para validarlo, puede probar un script simple

select id as i from table where i=3

y no funcionará, la razón es que el motor analizará Where before Select , por lo que no sabrá alias i en where . Para que esto funcione, puedes intentar

select * from (select id as i from table) as t where i = 3
maoyang
fuente