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

EF6环境下含Min和Max函数的SQL转LINQ查询求助

EF6环境下含Min和Max函数的SQL转LINQ查询求助

嗨,别发愁啦,我来帮你把这段SQL转换成EF6兼容的LINQ查询!先把你的原SQL贴出来方便对照:

SELECT
    AT.PrimaryIDChanged AS PID,
    MAX(AT.ProcessID) AS EventTypeID,
    MIN(AT.AuditDateTime) AS EventDate
FROM
    dbo.AuditTrail AS AT    
WHERE
    AT.AuditTargetTableID = 13
    AND AT.ProcessID IN (30, 31)
GROUP BY
    AT.PrimaryIDChanged 

这段SQL的逻辑很清晰:筛选出指定表ID和操作ID的记录,按PrimaryIDChanged分组后取每组的最大操作ID和最早操作时间,同时保留分组键作为PID。对应到EF6的LINQ,有两种常用写法,你可以选自己顺手的:

写法一:查询语法(更接近SQL结构,可读性高)

// 假设你的EF上下文实例是db
var query = from at in db.AuditTrail
            // 对应WHERE子句的筛选条件
            where at.AuditTargetTableID == 13 && new[] { 30, 31 }.Contains(at.ProcessID)
            // 对应GROUP BY子句,按PrimaryIDChanged分组
            group at by at.PrimaryIDChanged into groupedData
            // 对应SELECT子句,映射需要的字段
            select new 
            {
                PID = groupedData.Key, // 分组键就是原SQL的PrimaryIDChanged
                EventTypeID = groupedData.Max(g => g.ProcessID),
                EventDate = groupedData.Min(g => g.AuditDateTime)
            };

写法二:方法语法(链式调用,更灵活)

var query = db.AuditTrail
              // 筛选条件和上面一致
              .Where(at => at.AuditTargetTableID == 13 && new[] { 30, 31 }.Contains(at.ProcessID))
              // 按PrimaryIDChanged分组
              .GroupBy(at => at.PrimaryIDChanged)
              // 映射结果字段
              .Select(groupedData => new 
              {
                  PID = groupedData.Key,
                  EventTypeID = groupedData.Max(g => g.ProcessID),
                  EventDate = groupedData.Min(g => g.AuditDateTime)
              });

小提示:

  • 如果需要把结果映射到自定义实体类,只要把匿名类换成你的实体类型就行,比如new AuditResult { PID = groupedData.Key, ... }(前提是你已经定义了对应的实体)。
  • EF6会自动把这两种LINQ写法转换成和原SQL几乎一致的SQL语句执行,不用担心性能问题哦。

备注:内容来源于stack exchange,提问作者Peter Smith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 09:33:08