Requête LINQ pour sélectionner les cinq premiers

234

J'ai une requête LINQ:

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

Comment puis-je modifier cette requête pour sélectionner seulement cinq résultats dans la base de données?

109221793
la source
Prenez (how_many_you_wish)
snr

Réponses:

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
la source
5
+1, mais gah, encapsuler des expressions multilignes entre parenthèses, puis dé-référencer le tout me grogne vraiment pour une raison quelconque.
Docteur Jones
6
Cela semble prendre autant de résultats de la base de données que les conditions d'égalité, et ce n'est qu'après qu'ils soient extraits de la base de données qu'il applique la restriction take (5) dans l'application. Existe-t-il un moyen de littéralement takeuniquement les 5 premières lignes de la base de données?
JM Hicks
6
@JMHicks pas vraiment. La commande Take (5) ajoute seulement une autre condition à IQueryable, qui ne s'exécutera pas tant que vous ne l'énumérerez pas. Cependant, il peut y avoir des fournisseurs LINQ qui ne prennent pas en charge l'opération Take.
Bruno Brant
1
@JMHicks - ce n'est pas ainsi que fonctionne linq ... linq est paresseux.
Hogan
39

La solution:

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
la source
19

Ceci peut également être réalisé en utilisant l'approche basée sur Lambda de Linq;

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

[Offrant une réponse un peu plus descriptive que la réponse fournie par @Ajni .]

Cela peut également être réalisé en utilisant la syntaxe fluide LINQ :

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

Notez que chaque méthode ( Where, OrderBy, Take) qui apparaît dans cette déclaration de LINQ prend une expression lambda comme argument. Notez également que la documentation de Enumerable.Takecommence par:

Renvoie un nombre spécifié d'éléments contigus depuis le début d'une séquence.

DavidRR
la source
5

Additional information

Parfois, il est nécessaire de lier un modèle à une vue des modèles et de donner une erreur de conversion de type . Dans cette situation, vous devez utiliser la ToList()méthode.

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
la source
0

En pensant simplement que vous ne vous sentez pas familier avec la séquence From-> Where-> Select, comme dans le script sql, c'est comme Select-> From-> Where.

Mais vous ne savez peut-être pas que dans Sql Engine, il est également analysé dans la séquence ' From-> Where-> Select ', pour le valider, vous pouvez essayer un script simple

select id as i from table where i=3

et cela ne fonctionnera pas, la raison est que le moteur analysera Where before Select , donc il ne connaîtra pas l'alias i dans le where . Pour que cela fonctionne, vous pouvez essayer

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