LINQ to Entity Framework多分组与求和问题求助
解决方案
以下是与你原SQL逻辑完全匹配的LINQ实现,同时解决了日期提取和金额求和的问题:
方法一:流畅语法
var data = await _context.Commission .GroupBy(c => new { c.CommisionName, c.ClientId, DateOnly = c.Date.Date // 提取DateTime的日期部分,对应SQL的CAST(Date AS DATE) }) .Select(gcs => new { gcs.Key.ClientId, gcs.Key.CommisionName, gcs.Key.DateOnly, TotalAmount = gcs.Sum(c => c.Amount) // 计算分组内的Amount总和 }) .ToListAsync();
方法二:查询语法(和你原有代码风格一致)
var data = await (from c in _context.Commission group c by new { c.CommisionName, c.ClientId, DateOnly = c.Date.Date } into gcs select new { gcs.Key.ClientId, gcs.Key.CommisionName, gcs.Key.DateOnly, TotalAmount = gcs.Sum(c => c.Amount) }).ToListAsync();
关键改动说明
- 日期分组修正:将分组键中的
c.Date替换为c.Date.Date,EF Core会自动将其转换为SQL中的CAST(Date AS DATE)语句,实现仅按日期部分分组,而不是完整的DateTime。 - 添加求和逻辑:在
select块中通过gcs.Sum(c => c.Amount)实现原SQL的SUM(Amount)功能,直接计算每个分组的金额总和。 - 性能优化:移除了原代码中提前执行的
ToListAsync(),避免将全表数据加载到内存后再分组。现在的查询会由EF Core转换为与原SQL等价的数据库查询,所有分组和求和操作都在数据库端完成,性能更高效。
注意:如果你的
Date字段是可空类型(DateTime?),需要添加空值处理,例如:DateOnly = c.Date?.Date(C# 6+空传播语法),避免空引用异常。
内容的提问来源于stack exchange,提问作者RANDY
相关产品推荐
相关产品推荐

