You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 10:42:28