按多个日期列排序

天顶

我在逼近一个按我想要的方式按多个日期列排序的 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=date2where date1=nulldate1然后使用 更新原始表进行排序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;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章