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

SQL转Linq求助:将含多列聚合的SQL语句转换为Linq语句

SQL转Linq实现方案

查询语法(贴近原SQL结构,适合新手理解)

var result = from r in db.tbl_LeaveRequested
             join a in db.tbl_LeaveAllocation on r.LeaveTypeID equals a.LeaveTypeID
             join t in db.tbl_LeaveType on a.LeaveTypeID equals t.LeaveTypeID
             where r.LeaveStatus != "Rejected"
             group r by new { r.Id, a.LeaveTypeID, t.LeaveType } into g
             select new {
                 emp = g.Key.Id,
                 leave = g.Key.LeaveTypeID,
                 g.Key.LeaveType,
                 TotalDays = g.Sum(x => x.NumDaysRequested),
                 TotalHours = g.Sum(x => x.NumHoursRequested),
                 TotalMins = g.Sum(x => x.NumMinsRequested)
             };

方法语法(链式调用风格)

var result = db.tbl_LeaveRequested
    .Where(r => r.LeaveStatus != "Rejected")
    .Join(db.tbl_LeaveAllocation,
          r => r.LeaveTypeID,
          a => a.LeaveTypeID,
          (r, a) => new { r, a })
    .Join(db.tbl_LeaveType,
          ra => ra.a.LeaveTypeID,
          t => t.LeaveTypeID,
          (ra, t) => new { ra.r, ra.a, t })
    .GroupBy(x => new { x.r.Id, x.a.LeaveTypeID, x.t.LeaveType })
    .Select(g => new {
        emp = g.Key.Id,
        leave = g.Key.LeaveTypeID,
        g.Key.LeaveType,
        TotalDays = g.Sum(x => x.r.NumDaysRequested),
        TotalHours = g.Sum(x => x.r.NumHoursRequested),
        TotalMins = g.Sum(x => x.r.NumMinsRequested)
    });

核心要点说明

  • 内连接通过join关键字(查询语法)或Join方法(方法语法)实现,匹配逻辑对应原SQL的ON子句
  • where子句过滤掉状态为Rejected的请求记录
  • 分组时用匿名类封装所有需要分组的字段,对应原SQL的GROUP BY列表
  • 聚合计算使用Sum方法,分别统计三个时长字段的总和
  • 最终通过匿名类返回与原SQL查询结果结构一致的字段

内容的提问来源于stack exchange,提问作者Hani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 02:52:09