Richiesta LINQ in ordine decrescente


439

Sono sicuro che sarà relativamente semplice.

Ho una query LINQ che desidero ordinare entro la data di creazione più recente.

Vedere:

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

Ho anche provato:

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

ma questo dà un errore:

Nessun sovraccarico per il metodo 'OrderByDescending' accetta 0 argomenti

Da quello che ho letto, sono abbastanza sicuro che il primo modo in cui l'ho fatto dovrebbe funzionare. Ho provato a cambiare discendente in crescente solo per vedere se fa qualcosa ma rimane lo stesso.

Le sarei grato se qualcuno potesse dare un'occhiata alla domanda e vedere se sto facendo qualcosa di sbagliato. Grazie :)

Risposte:


674

Devi scegliere una Proprietà per ordinarla e passarla come espressione lambda OrderByDescending

piace:

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

Davvero, anche se la prima versione dell'istruzione LINQ dovrebbe funzionare. In t.Delivery.SubmissionDaterealtà è popolato con date valide?


2
Ciao optus, grazie per la tua risposta. Ho capito quale fosse il problema. Stavo usando un elenco impaginato, e in realtà stava facendo l'ordinamento da quella classe di supporto. Contrassegnerò la tua risposta come corretta una volta
— scaduto

175

Penso che questo sia fallito perché stai ordinando un valore nullo. Se Delivery è una tabella associata a chiave esterna, è necessario includere prima questa tabella, esempio di seguito:

var itemList = from t in ctn.Items.Include(x=>x.Delivery)
                    where !t.Items && t.DeliverySelection
                    orderby t.Delivery.SubmissionDate descending
                    select t;

include è equivalente a DataLoadOptions dlo = new DataLoadOptions (); dlo.LoadWith <Items> (i => i.Delivery); ctn.LoadOptions = dlo;
— mrosiak,

29

Penso che il secondo dovrebbe essere

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

Penso che sia corretto nei suoi confronti, avevo scritto la query in modo errato quando l'avevo postato (es. Lasciando nella seconda ultima riga di ordine) e probabilmente ha appena copiato e incollato per dimostrare l'uso di Lambda OrderByDescending.
— 109221793,

6

Solo per mostrarlo in un formato diverso che preferisco usare per qualche motivo: il primo modo restituisce il tuo itemList come System.Linq.IOrderedQueryable

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

L'approccio va bene, ma se lo volevi direttamente in un oggetto elenco:

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

Tutto quello che devi fare è aggiungere una chiamata .ToList () alla fine della query.

Qualcosa da notare, dalla parte superiore della mia testa non riesco a ricordare se l'espressione! (Non) è accettabile nella chiamata Where ().

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.