Linq OrderByDescending有两个可以为空的日期列

时间:2013-03-06 12:12:17

标签: c# linq lambda

我有一个包含两个可以为空的日期时间列,ETA和ETD的表。一个人总是有价值。我想按日期订购表格。因此,例如,如果ETA为null,则使用ETD进行排序。如果ETD为null,则使用ETA,如果两者都不为空,则使用ETA(因为它始终是第一个)。

我有这个:

var route = db.RouteJourney.Where(j => j.JourneyId == id).OrderByDescending(j => j.ETA ?? j.ETD);

我也试过这个(这是相同的):

var route = db.RouteJourney.Where(j => j.JourneyId == id).OrderByDescending(j => j.ETA.HasValue ? j.ETA : j.ETD);

我错过了什么吗?我的小脑子说,如果ETA为空,请使用ETD然后订购,但它没有给出正确的结果。

感谢任何帮助。

修改

我得到了这个:

如果RouteJourney是[Name,RouteId(Key),JourneyId,ETA,ETD]

和值是:

[停止A,1,1,null,10/03/13],[停止B,4,1,12 / 03 / 13,13 / 03/13],[停止C,2,1,14 / 03/13,null],[停止D,3,1,16 / 03/13,null]

这样订购:

停止C 停止B. 停止A. 停止D

...谢谢

1 个答案:

答案 0 :(得分:4)

尝试使用匿名类型

var route = 
    db.RouteJourney
    .Where(j => j.JourneyId == id)
    .OrderByDescending(item =>
        (new { DT = item.ETA.HasValue ? item.ETA : item.ETD }).DT);     

在QES中更好或更好:

var route =
    from item in db.RouteJourney
    where item.JourneyId == id
    order by
        (new { DT = item.ETA.HasValue ? item.ETA : item.ETD }).DT
    descending
    select item;