我很难近似一个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
更新原始表,但这很草率,我不确定性能成本。
答案 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);