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?


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);

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);

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);

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.


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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.