Consulta LINQ para selecionar os cinco principais

234

Eu tenho uma consulta LINQ:

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

Como posso modificar esta consulta para selecionar apenas cinco resultados do banco de dados?

109221793
fonte
Take (how_many_you_wish)
snr

Respostas:

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
fonte
5
+1, mas gah, agrupar expressões multilinhas entre parênteses e, em seguida, des-referenciar todo o lote realmente me irrita por algum motivo.
Doctor Jones
6
Isso parece ter tantos resultados no banco de dados quanto corresponder às condições de igualdade, e somente depois que eles são retirados do banco de dados é que aplica a restrição take (5) no aplicativo. Existe uma maneira de literalmente takeapenas as 5 primeiras linhas do banco de dados?
JM Hicks
6
@JMHicks realmente não. O comando Take (5) está adicionando apenas outra condição ao IQueryable, que não será executado até que você a enumere. No entanto, pode haver provedores LINQ que não suportam a operação Take.
Bruno Brant
1
@JMHicks - não é assim que o linq funciona ... o linq é preguiçoso.
Hogan
39

A solução:

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
fonte
19

Isso também pode ser alcançado usando a abordagem baseada no Lambda do Linq;

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

[Oferecendo uma resposta um pouco mais descritiva do que a resposta fornecida por @Ajni .]

Isso também pode ser alcançado usando a sintaxe fluente do LINQ :

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

Note-se que cada método ( Where, OrderBy, Take) que aparece neste comunicado LINQ toma uma expressão lambda como um argumento. Observe também que a documentação para Enumerable.Takecomeça com:

Retorna um número especificado de elementos contíguos desde o início de uma sequência.

DavidRR
fonte
5

Additional information

Às vezes, é necessário vincular um modelo a um modelo de visualização e fornecer um erro de conversão de tipo . Nesta situação, você deve usar o 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
fonte
0

Apenas pensando que você talvez não se familiarize com a sequência De-> Onde-> Selecionar, como no script sql, é como Selecionar-> De-> Onde.

Mas você pode não saber que, dentro do Sql Engine, ele também é analisado na sequência de ' De-> Onde-> Selecionar '. Para validá-lo, você pode tentar um script simples

select id as i from table where i=3

e não funcionará, o motivo é que o mecanismo analisará Onde antes do Select , para que ele não saiba o alias i no local . Para fazer isso funcionar, você pode tentar

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