C# orderByDescending日期、月份和年份

C# orderByDescending日期、月份和年份,c#,linq,C#,Linq,我使用LINQ查询按降序日期获取数据顺序。但是,当年份发生变化时,日期的降序是不正确的 这是我的密码 在这段代码中,LastLogin是DateTime数据类型的列。我必须按此列名对数据进行排序 var res = objUI.Where(x => x.LastLogin != null) .GroupBy(x => x.LastLogin.Value.Date) .Select(x => new { LastLogi

我使用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();

您不应该尝试将日期作为字符串排序

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();
您是按以月份开始的字符串表示进行排序的

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

最后,如果要格式化单个值(当然是
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();

您应该在投影之前对集合进行排序。Select方法将日期投影到字符串中。