orderByDescending日期,月份和年份

时间:2018-01-02 12:15:21

标签: c# linq

我正在使用LINQ查询来按降序日期获取数据顺序。但是当年份改变时,日期的降序顺序不正确

这是我的代码

在此代码中,LastLogin是一个具有DateTime数据类型的列。我必须按此列名对数据进行排序。

var res = objUI.Where(x => x.LastLogin != null)
               .GroupBy(x => x.LastLogin.Value.Date)
               .Select(x => new { LastLogin = string.Format("{0:MM/dd/yyyy}", x.Key) })
               .OrderByDescending(x => x.LastLogin)
               .ToList();

2 个答案:

答案 0 :(得分:9)

您不应该尝试将日期命名为字符串;

var res = objUI.Where(x => x.LastLogin != null)
    .GroupBy(x => x.LastLogin.Value.Date)
    .OrderByDescending(x => x.Key)
    .Select(x => new { LastLogin = string.Format("{0:MM/dd/yyyy}", x.Key) })
    .ToList();

答案 1 :(得分:7)

您按照字符串表示订购,以月份开头。

看起来你实际上只对不同的日期感兴趣 - 分组然后丢弃除了键之外的所有内容相当于只是投影然后获取不同的数据。我还建议避免匿名类型,除非你真的需要它 - 一个只有一个属性的匿名类型通常是个坏主意。

最后,如果您要格式化单个值 - 当然是DateTime值 - 只需调用ToString方法即可。在下面的代码中,我也明确指定了不变文化 - 否则您可能会发现使用了意外的日历系统......

所以我写道:

var res = objUI.Where(x => x.LastLogin != null)
               .Select(x => x.LastLogin)
               .Distinct()
               .OrderByDescending(x => x)
               .Select(x => x.ToString("MM/dd/yyyy", CultureInfo.InvariantCulture))
               .ToList();