Linq OrderByDescending,首先为null

时间:2011-09-03 05:52:43

标签: c# linq

我的数据库中有一个包含DateTime的字段?我想对结果进行排序,以便NULL显示在顶部,然后按DateTime降序,例如,

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

原因是我正在查看到期日期,但有些条目不会过期。

5 个答案:

答案 0 :(得分:148)

您可以从排序表达式返回DateTime.MaxValue而不是null,因此首先排序null个日期的行:

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

答案 1 :(得分:28)

我找到了最简单的方法:

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。

答案 2 :(得分:2)

您可以尝试这样的事情:

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

它“显然是正确的”而不是“可能超级高效”,但它至少是一个起点。

答案 3 :(得分:0)

查看David Oesterreich's blog:

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

答案 4 :(得分:0)

与上面接受的版本类似,但使用c#v6的语法

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