我有一个类似于下面(MyData类)的对象列表,我将使用LINQ查询来获取那些满足SecondDate属性约束的对象,最后根据所有属性对满足此约束的项进行排序.
public class MyData
{
public Nullable<DateTime> FirstDate {get; set;}
public DateTime SecondDate {get; set;}
public TimeSpan SimpleInterval {get; set;}
public double SimpleValue {get; set;}
...
}
Run Code Online (Sandbox Code Playgroud)
我写了以下查询,但我不知道如何处理该Nullable <DateTime> FirstDate属性.设置为此属性的项null应排序低于具有相同字段值的另一项,但此属性设置为非空值.
// public static void main
double threshold = ... // some initialization
DateTime now = DateTime.Now;
List<MyData> list = new List<MyData>();
...
var items = from item in list
where ((now - item.SecondDate).TotalSeconds < threshold))
orderby item.FirstDate descending
orderby item.SecondDate descending
orderby item.SimpleInterval descending
orderby item.SimpleValue descending
select item
Run Code Online (Sandbox Code Playgroud)
您可以使用该HasValue属性,例如:
orderby item.FirstDate.HasValue descending,
item.FirstDate.GetValueOrDefault() descending
Run Code Online (Sandbox Code Playgroud)
请注意,orderby在查询表达式中使用多个子句几乎肯定不是您想要做的 - 您的查询可能应该是:
var items = from item in list
where ((now - item.SecondDate).TotalSeconds < threshold))
orderby item.FirstDate.HasValue descending,
item.FirstDate.GetValueOrDefault() descending,
item.SecondDate descending,
item.SimpleInterval descending,
item.SimpleValue descending
select item;
Run Code Online (Sandbox Code Playgroud)
请注意,这是一个很好的通用解决方案,因为它不依赖于默认值低于/高于数据中的任何值.default(DateTime)实际上实际上是等于DateTime.MinValue,但是IMO不依赖于它是好的,但是分别说"我首先想要通过null来对非null,然后是值".它还意味着即使存在非空DateTime.MinValue值,也会在空数据之前对非空数据进行排序.
在您当前的查询中,它有效地在每个字段上执行新的(稳定)排序,而不是仅将其用作打破平局.如果您之前的查询给出了您想要的内容,那么您应该颠倒排序的顺序(原样):
var items = from item in list
where ((now - item.SecondDate).TotalSeconds < threshold))
orderby item.SimpleValue descending,
item.SimpleInterval descending,
item.SecondDate descending,
item.FirstDate.HasValue descending,
item.FirstDate.GetValueOrDefault() descending
select item;
Run Code Online (Sandbox Code Playgroud)
orderby基本上,连续条款几乎总是一个错误.