267 votes

Requête LINQ pour sélectionner les cinq premiers

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 ne sélectionner que cinq résultats dans la base de données ?

3 votes

Prendre(combien_de_vous_souhaitez)

491voto

Gidon Points 8758
var list = (from t in ctn.Items
           where t.DeliverySelection == true && t.Delivery.SentForDelivery == null
           orderby t.Delivery.SubmissionDate
           select t).Take(5);

7 votes

+1, mais gah, envelopper des expressions multi-lignes dans des parenthèses et ensuite dé-référencer le tout m'ennuie vraiment pour une raison quelconque.

11 votes

Cela semble prendre autant de résultats de la base de données qui correspondent aux conditions d'égalité, et seulement après qu'ils aient été pris de la base de données, il applique la restriction take(5) dans l'application. Existe-t-il un moyen de littéralement take seulement les 5 premières lignes de la base de données ?

7 votes

@JMHicks pas vraiment. La commande Take(5) ne fait qu'ajouter une autre condition à l'IQueryable, qui ne s'exécutera pas tant que vous ne l'aurez pas énumérée. Cependant, il peut y avoir des fournisseurs LINQ qui ne supportent pas l'opération Take.

44voto

Harold Sota Points 2707

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

27voto

Anji Points 21

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

10voto

DavidRR Points 2211

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

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

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 instruction LINQ prend une valeur de expression lambda en tant qu'argument. Notez également que la documentation de Enumerable.Take commence par :

Renvoie un nombre spécifié d'éléments contigus à partir du début d'une séquence.

7voto

topcool Points 683

Additional information

Parfois, il est nécessaire de lier un modèle à un modèle de vue et de donner à un erreur de conversion de type . Dans cette situation, vous devez utiliser 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();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X