LINQ Orderby по убыванию запроса

439

Я уверен, что это будет относительно просто.

У меня есть запрос LINQ, который я хочу заказать к последней дате создания.

Видеть:

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

Я также попробовал:

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

но это дает ошибку:

Никакая перегрузка для метода 'OrderByDescending' не принимает 0 аргументов

Из того, что я прочитал, я уверен, что первый способ сделать это должен сработать. Я пытался изменить нисходящий на восходящий, чтобы посмотреть, что он делает, но он остается прежним.

Я был бы признателен, если бы кто-то мог взглянуть на запрос и посмотреть, делаю ли я что-то не так. Спасибо :)

109221793
источник

Ответы:

674

Вам нужно выбрать свойство для сортировки и передать его как лямбда-выражение OrderByDescending

подобно:

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

Действительно, хотя первая версия вашего заявления LINQ должна работать. На t.Delivery.SubmissionDateсамом деле заполнены действительными датами?

Адам Прайс
источник
2
Привет optus, спасибо за ваш ответ. Я понял, в чем проблема. Я использовал paginatedList, и он фактически делал упорядочивание из этого вспомогательного класса. Я
отмечу
175

Я думаю, что это сначала не удалось, потому что вы заказываете значение, которое является нулевым. Если Delivery является таблицей, связанной с внешним ключом, то вам следует сначала включить эту таблицу, например ниже:

var itemList = from t in ctn.Items.Include(x=>x.Delivery)
                    where !t.Items && t.DeliverySelection
                    orderby t.Delivery.SubmissionDate descending
                    select t;
mrosiak
источник
include эквивалентен DataLoadOptions dlo = new DataLoadOptions (); dlo.LoadWith <Items> (i => i.Delivery); ctn.LoadOptions = dlo;
Mrosiak
29

Я думаю, что второй должен быть

var itemList = (from t in ctn.Items
                where !t.Items && t.DeliverySelection
                select t).OrderByDescending(c => c.Delivery.SubmissionDate);
Джонатан
источник
Я думаю, чтобы быть справедливым по отношению к нему, я напечатал запрос неправильно, когда я отправил (то есть. Оставляя во второй последней строке orderby), и он, вероятно, просто скопировал и вставил, чтобы продемонстрировать использование лямбды OrderByDescending.
109221793
6

Просто чтобы показать его в другом формате, который я по какой-то причине предпочитаю использовать: Первый способ возвращает ваш itemList как System.Linq.IOrderedQueryable

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

Этот подход хорош, но если вы хотите прямо в List Object:

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

Все, что вам нужно сделать, это добавить вызов .ToList () в конец запроса.

Что-то, на что стоит обратить внимание, не могу вспомнить, допустимо ли выражение! (Not) в вызове Where ().

nulltron
источник