Подтвердить что ты не робот

Linq OrderByDescending, null сначала

У меня есть поле в моей базе данных, которое содержит DateTime?. Я хотел бы отсортировать результаты так, чтобы NULL отображались вверху, затем спускались по DateTime, например,

null
null
2012-04-01
2012-01-01
2011-09-04

Причина в том, что я смотрю даты истечения срока действия, хотя некоторые записи не истекают.

4b9b3361

Ответ 1

Вы можете вернуть DateTime.MaxValue вместо null из выражения упорядочения, поэтому строки с null датами сначала сортируются:

yourData.OrderByDescending(row => row.dateTimeField ?? DateTime.MaxValue);

Ответ 2

Я считаю самый простой подход:

data.OrderBy(Function(o) o.myDate IsNot Nothing).ThenByDescending(Function(o) o.myDate)

в С# я думаю...

data.OrderBy(o => o.myDate != null).ThenByDescending(o => o.myDate)

Это также будет работать с LINQ to SQL. Я не уверен, что if(nullable, value) успешно переведёт в SQL.

Ответ 3

Вы можете попробовать что-то вроде этого:

var nulls = table.Where(x => x.NullableDateTimeField == null);
var notNulls = table.Where(x => x.NullableDateTimeField != null);

var result = nulls.Concat(notNulls.OrderByDescending(x => x.NullableDateTimeField));

Это более "очевидно правильно", чем "вероятно, будет суперэффективным", но это, по крайней мере, отправная точка.

Ответ 4

Взгляните на Блог Дэвида Остеррейха:

var queryResult =
orderedProducts from enumerableProducts
order by orderedProducts.ProductName,
orderedProducts.Price != null ? 1 : 0 descending,
orderedProducts.Price
select orderedProducts;

Ответ 5

как принятая версия выше, но с синтаксисом для С# v6

tickets.OrderByDescending(x => x?.Erstellt ?? DateTime.Now)