Commande LINQ par requête décroissante

439

Je suis sûr que ce sera relativement simple.

J'ai une requête LINQ que je souhaite commander à la date de création la plus récente.

Voir:

        var itemList = from t in ctn.Items
                        where !t.Items && t.DeliverySelection
                        orderby t.Delivery.SubmissionDate descending
                        select t;

J'ai aussi essayé:

       var itemList = (from t in ctn.Items
                        where !t.Items && t.DeliverySelection
                        select t).OrderByDescending();

mais cela donne une erreur:

Aucune surcharge pour la méthode 'OrderByDescending' prend 0 arguments

D'après ce que j'ai lu, je suis assez sûr que la première façon dont je l'ai fait devrait fonctionner. J'ai essayé de changer descendant en ascendant juste pour voir s'il fait quelque chose mais il reste le même.

Je serais reconnaissant si quelqu'un pouvait jeter un œil à la requête et voir si je fais quelque chose de mal. Merci :)

109221793
la source

Réponses:

674

Vous devez choisir une propriété à trier et la passer en tant qu’expression lambda à OrderByDescending

comme:

.OrderByDescending(x => x.Delivery.SubmissionDate);

Vraiment, bien que la première version de votre instruction LINQ devrait fonctionner. Est en t.Delivery.SubmissionDatefait rempli de dates valides?

Adam Price
la source
2
Salut optus, merci pour votre réponse. J'ai compris quel était le problème. J'utilisais une paginatedList, et c'était en fait la commande de cette classe d'aide. Je marquerai votre réponse comme correcte une fois le délai écoulé :)
109221793
175

Je pense que cela a d'abord échoué parce que vous commandez une valeur nulle. Si la livraison est une table associée à une clé étrangère, vous devez d'abord inclure cette table, exemple ci-dessous:

var itemList = from t in ctn.Items.Include(x=>x.Delivery)
                    where !t.Items && t.DeliverySelection
                    orderby t.Delivery.SubmissionDate descending
                    select t;
mrosiak
la source
include est équivalent à DataLoadOptions dlo = new DataLoadOptions (); dlo.LoadWith <Items> (i => i.Delivery); ctn.LoadOptions = dlo;
mrosiak
29

Je pense que le second devrait être

var itemList = (from t in ctn.Items
                where !t.Items && t.DeliverySelection
                select t).OrderByDescending(c => c.Delivery.SubmissionDate);
Jonathan
la source
Je pense que pour être juste envers lui, j'avais mal tapé la requête lorsque j'ai posté (c'est-à-dire en laissant l'avant-dernière ligne de commande) et il a probablement juste copié et collé pour démontrer l'utilisation du lambda OrderByDescending.
109221793
6

Juste pour l'afficher dans un format différent que je préfère utiliser pour une raison quelconque: La première façon renvoie votre itemList en tant que System.Linq.IOrderedQueryable

using(var context = new ItemEntities())
{
    var itemList = context.Items.Where(x => !x.Items && x.DeliverySelection)
                                .OrderByDescending(x => x.Delivery.SubmissionDate);
}

Cette approche est très bien, mais si vous le vouliez directement dans un objet List:

var itemList = context.Items.Where(x => !x.Items && x.DeliverySelection)
                                .OrderByDescending(x => x.Delivery.SubmissionDate).ToList();

Tout ce que vous avez à faire est d'ajouter un appel .ToList () à la fin de la requête.

Quelque chose à noter, du haut de ma tête, je ne me souviens pas si l'expression! (Not) est acceptable dans l'appel Where ().

nulltron
la source