Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按多个日期列排序_C#_Linq - Fatal编程技术网

C# 按多个日期列排序

C# 按多个日期列排序,c#,linq,C#,Linq,我很难用我想要的方式近似一个按多个日期列排序的linq查询。问题是我想得到表的第一行和最后一行(并为这些行设置isFirst和isLast变量),按两列排序;date1和date2,如果date1有一个值,则应按的顺序使用该值。如果date2有一个值,而date1没有值,请按顺序使用date2 在T-SQL中,我的查询如下所示: SELECT * FROM MyDataTable ORDER BY CASE WHEN date1 IS NOT NULL

我很难用我想要的方式近似一个按多个日期列排序的linq查询。问题是我想得到表的第一行和最后一行(并为这些行设置isFirst和isLast变量),按两列排序;date1和date2,如果date1有一个值,则应按的顺序使用该值。如果date2有一个值,而date1没有值,请按顺序使用date2

在T-SQL中,我的查询如下所示:

SELECT * FROM MyDataTable 
    ORDER BY 
        CASE
        WHEN date1 IS NOT NULL
            THEN date1
        WHEN date2 IS NOT NULL AND date1 IS NULL
            THEN date2
        END
    DESC
这正是我想要的:

Id      date1       date2       isFirst   isLast
------------------------------------------------
1234    null        4/3/2014    False     True
1232    3/5/2014    3/7/2014    False     False
1236    8/20/2013   null        False     False
1233    null        4/5/2013    False     False
1235    12/5/2012   null        False     False
1239    9/12/2011   null        False     False
1240    8/5/2011    null        True      False
我不知道接下来该怎么办

MyDataTable.OrderByDescending(x=>x.date1).ThenByDescending(x=>x.date2)
没有给我我所需要的,因为date2无论如何都是最后一次。
我尝试使用一个临时表,设置
date1=date2
,其中
date1=null
,按
date1
排序,然后使用
Id
更新原始表,但这相当草率,而且我不确定此操作的性能成本。

使用
HasValue
操作符

var query  = MyDataTable
   .OrderByDescending(x => x.date1.HasValue ? x.date1.Value : x.date2 ?? DateTime.MinValue);
对于问题的第一部分/最后一部分,如果您想用此查询填充集合,并且在集合中足以确定它,您可以简单地使用:

var list = query
    .Select(x => new EntityTypeName
    { 
        ..., 
        IsFirst = false, 
        IsLast = false
    }).ToList();

if(list.Count > 0)
    list[0].IsFirst = true;
if(list.Count > 1)
    list[list.Count-1].IsLast = true;

使用
HasValue
运算符

var query  = MyDataTable
   .OrderByDescending(x => x.date1.HasValue ? x.date1.Value : x.date2 ?? DateTime.MinValue);
对于问题的第一部分/最后一部分,如果您想用此查询填充集合,并且在集合中足以确定它,您可以简单地使用:

var list = query
    .Select(x => new EntityTypeName
    { 
        ..., 
        IsFirst = false, 
        IsLast = false
    }).ToList();

if(list.Count > 0)
    list[0].IsFirst = true;
if(list.Count > 1)
    list[list.Count-1].IsLast = true;

假设date1和date2可为空: 您可以使用
?:
运算符来模拟EF中的if-else

MyDataTable
    .OrderByDescending(x =>
                        x.date1.HasValue ?
                            x.date1 : x.date2);

假设date1和date2可为空: 您可以使用
?:
运算符来模拟EF中的if-else

MyDataTable
    .OrderByDescending(x =>
                        x.date1.HasValue ?
                            x.date1 : x.date2);

x.date1.HasValue吗?x、 日期1.值:x.date2??DateTime.MinValue
简化为
x.date1??x、 日期2??DateTime.MinValue
?谢谢,这真的让我开心!我不得不用一个附加条件来修改语句,因为我在使用datetime时收到了关于空合并运算符的投诉,但除此之外,还需要完美。可以
x.date1.HasValue吗?x、 日期1.值:x.date2??DateTime.MinValue
简化为
x.date1??x、 日期2??DateTime.MinValue
?谢谢,这真的让我开心!我不得不用一个附加条件来修改语句,因为我在使用datetime时收到了关于空合并操作符的投诉,但除此之外,这是完美的。