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
相关产品推荐
相关产品推荐

