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?


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

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

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

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.


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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.