按多个日期列排序

时间:2018-10-29 11:11:20

标签: c# linq

我很难近似一个linq查询,该查询按我想要的方式按多个日期列排序。问题是我想获取表的第一行和最后一行(并为它们设置isFirst和isLast变量),并按两列进行排序; date1和date2的方式是,如果date1具有值,则应在 ORDER BY 中使用它。如果date2有值而date1没有值,请在 ORDER BY 中使用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更新原始表,但这很草率,我不确定性能成本。

2 个答案:

答案 0 :(得分:1)

使用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;

答案 1 :(得分:1)

假定date1和date2可为空: 您可以使用?:运算符来模拟EF中是否还有其他

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