Linq OrderByDescending, null first


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

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

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

5 56

5 ответов:

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

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

Я нахожу наиболее простой подход, чтобы быть:

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

В C# я думаю...

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

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

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

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));

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

посмотри блог Дэвида Остеррайха:

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

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

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