在EF Core Linq GroupBy语句中用前导零格式化日期

时间:2020-05-15 08:28:17

标签: c# linq linq-to-sql ef-core-3.1

我有一个LINQ语句(EF Core 3.1),在这里我想按时间戳列的年和月分组。 “ 2020-03”。

this.form

问题在于日期的结果格式为“ 2020-3”,这会导致以后的排序问题。

如何将月份字符串格式化为始终以2开头的零数字?

我读了很多有关SqlFunction的文章-但是这些在EF Core中不可用。还有其他方法吗?

2 个答案:

答案 0 :(得分:2)

您可以按实际的年/月分组,然后规划这些值。这样,分组完全在SQL中完成。有了内存中的集合后,您可以再次投影以创建您的排序键以及D2 format specifer

var result = _context.Messages
            .Where(x => x.timestamp != null)
            .GroupBy(x => new { 
                x.timestamp.Value.Year,
                x.timestamp.Value.Month
             })
            .Select(x => new { 
                Year = x.Key.Year, 
                Month = x.Key.Month, 
                Count = x.Count() 
             })
            .AsEnumerable()
            .Select(x => new {
                Date = $"{x.Year:D2}-{x.Month:D2}",
                Count = x.Count
             }) 
            .ToList();

答案 1 :(得分:1)

您可以使用值{d2“的ToString()方法的格式重载。这样,格式将确保您始终获得两位数:

x.timestamp.Value.Month.ToString("d2")