LINQ Kolejność malejących zapytań

439

Jestem pewien, że będzie to stosunkowo proste.

Mam zapytanie LINQ, które chcę zamówić według ostatnio utworzonej daty.

Widzieć:

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

Próbowałem też:

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

ale to powoduje błąd:

Brak przeciążenia dla metody „OrderByDescending” wymaga 0 argumentów

Z tego, co przeczytałem, jestem całkiem pewien, że pierwszy sposób, w jaki to zrobiłem, powinien zadziałać. Próbowałem zmienić malejącą na rosnącą, aby zobaczyć, czy coś robi, ale pozostaje niezmienione.

Byłbym wdzięczny, gdyby ktoś mógł rzucić okiem na zapytanie i sprawdzić, czy robię coś złego. Dzięki :)

109221793
źródło

Odpowiedzi:

674

Musisz wybrać Właściwość do sortowania i przekazać ją jako wyrażenie lambda OrderByDescending

lubić:

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

Naprawdę, choć pierwsza wersja instrukcji LINQ powinna działać. Czy t.Delivery.SubmissionDatefaktycznie są wypełnione prawidłowe daty?

Adam Price
źródło
2
Cześć optus, dziękuję za odpowiedź. Dowiedziałem się, na czym polega problem. Korzystałem z paginatedList i faktycznie porządkowałem tę klasę pomocnika.
Oznaczę
175

Myślę, że to pierwsze nie powiodło się, ponieważ zamawiasz wartość, która jest zerowa. Jeśli dostawa jest tabelą powiązaną z kluczem obcym, najpierw należy dołączyć tę tabelę, przykład poniżej:

var itemList = from t in ctn.Items.Include(x=>x.Delivery)
                    where !t.Items && t.DeliverySelection
                    orderby t.Delivery.SubmissionDate descending
                    select t;
mrosiak
źródło
include jest równoważne DataLoadOptions dlo = new DataLoadOptions (); dlo.LoadWith <Items> (i => i.Delivery); ctn.LoadOptions = dlo;
mrosiak
29

Myślę, że drugi powinien być

var itemList = (from t in ctn.Items
                where !t.Items && t.DeliverySelection
                select t).OrderByDescending(c => c.Delivery.SubmissionDate);
Jonathan
źródło
Wydaje mi się, że jestem wobec niego sprawiedliwy, źle wpisałem zapytanie, gdy pisałem (tj. Pozostawiając w drugim wierszu z ostatnim zamówieniem), a on prawdopodobnie po prostu skopiował i wkleił, aby zademonstrować użycie lambda OrderByDescending.
109221793,
6

Aby pokazać go w innym formacie, z którego wolę korzystać z jakiegoś powodu: Pierwszy sposób zwraca twoją itemList jako System.Linq.IOragedQueryable

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

Takie podejście jest w porządku, ale jeśli chcesz bezpośrednio do obiektu listy:

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

Wszystko, co musisz zrobić, to dołączyć wywołanie .ToList () na końcu zapytania.

Coś, na co należy zwrócić uwagę, nie mogę sobie przypomnieć, czy wyrażenie! (Nie) jest dopuszczalne w wywołaniu Where ().

nulltron
źródło