Ответ 1
Вы можете вернуть DateTime.MaxValue вместо null
из выражения упорядочения, поэтому строки с null
датами сначала сортируются:
yourData.OrderByDescending(row => row.dateTimeField ?? DateTime.MaxValue);
У меня есть поле в моей базе данных, которое содержит DateTime?. Я хотел бы отсортировать результаты так, чтобы NULL отображались вверху, затем спускались по DateTime, например,
null
null
2012-04-01
2012-01-01
2011-09-04
Причина в том, что я смотрю даты истечения срока действия, хотя некоторые записи не истекают.
Вы можете вернуть DateTime.MaxValue вместо null
из выражения упорядочения, поэтому строки с null
датами сначала сортируются:
yourData.OrderByDescending(row => row.dateTimeField ?? DateTime.MaxValue);
Я считаю самый простой подход:
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.
Вы можете попробовать что-то вроде этого:
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;
как принятая версия выше, но с синтаксисом для С# v6
tickets.OrderByDescending(x => x?.Erstellt ?? DateTime.Now)