C#中如何按DateReference日期分组并返回对象?
按日期分组Registration记录的高效查询方案
EF Core/LINQ 实现
直接通过LINQ的GroupBy方法,基于DateReference的日期部分分组,EF Core会将逻辑转换为数据库原生SQL执行,避免内存分组的性能损耗:
// 异步查询,按日期分组并获取当天所有记录 var groupedData = await _dbContext.Registrations .GroupBy(reg => reg.DateReference.Date) .Select(group => new { GroupDate = group.Key, DailyRecords = group.ToList() }) .ToListAsync();
原生SQL 实现
如果需要直接写SQL,可通过CAST(DateReference AS DATE)提取日期作为分组键,同时支持将当天记录打包为JSON数组(以SQL Server为例):
SELECT CAST(DateReference AS DATE) AS GroupDate, ( SELECT MinuteWorked, Status FROM Registrations r_sub WHERE CAST(r_sub.DateReference AS DATE) = CAST(r_main.DateReference AS DATE) FOR JSON PATH ) AS DailyRecords FROM Registrations r_main GROUP BY CAST(DateReference AS DATE);
性能优化关键
因为表中有20万+记录,必须确保查询高效:
- 给
DateReference字段创建非聚集索引,并包含查询需要返回的字段(MinuteWorked、Status),让数据库可以直接通过索引完成分组,避免全表扫描:
CREATE NONCLUSTERED INDEX IX_Registrations_DateReference ON dbo.Registrations (DateReference) INCLUDE (MinuteWorked, Status);
- 绝对不要先将全表数据加载到内存再分组,这会导致内存占用过高且速度极慢,必须让分组逻辑在数据库端执行。
内容的提问来源于stack exchange,提问作者devludo
相关产品推荐
相关产品推荐

