如何在LINQ查询中正确使用Min()和Max()?SQL转LINQ求助
将SQL转换为LINQ的解决方案
你的SQL本质是关联三个表后按指定字段分组,提取每组的最小时间戳和最大Pr值,同时返回分组字段。以下是对应的LINQ实现,提供两种常用写法:
查询语法(接近SQL结构,可读性强)
var result = from r in db.Records join e in db.Exercises on r.ExerciseId equals e.Id join u in db.Users on r.UserId equals u.Id group new { r, e, u } by new { r.ExerciseId, r.UserId, e.Name, u.FirstName, u.LastName, e.SubHeader, e.PrType } into g select new { TimeStamp = g.Min(x => x.r.TimeStamp), g.Key.ExerciseId, g.Key.UserId, Pr = g.Max(x => x.r.Pr), g.Key.Name, g.Key.FirstName, g.Key.LastName, g.Key.SubHeader, g.Key.PrType };
方法语法(链式调用,灵活度高)
var result = db.Records .Join(db.Exercises, r => r.ExerciseId, e => e.Id, (r, e) => new { r, e }) .Join(db.Users, re => re.r.UserId, u => u.Id, (re, u) => new { re.r, re.e, u }) .GroupBy(x => new { x.r.ExerciseId, x.r.UserId, x.e.Name, x.u.FirstName, x.u.LastName, x.e.SubHeader, x.e.PrType }) .Select(g => new { TimeStamp = g.Min(x => x.r.TimeStamp), g.Key.ExerciseId, g.Key.UserId, Pr = g.Max(x => x.r.Pr), g.Key.Name, g.Key.FirstName, g.Key.LastName, g.Key.SubHeader, g.Key.PrType });
关键说明
- 用
join替代SQL中的隐式连接,避免潜在的笛卡尔积问题,逻辑更清晰。 group by后的匿名类完全对应SQL的GROUP BY字段列表。- 在
select阶段,通过g.Min()和g.Max()分别提取每组的最小时间戳和最大Pr值,和SQL的聚合函数逻辑一致。 - 确保你的数据上下文(
db)中Records、Exercises、Users三个DbSet对应数据库的三个表,实体类属性名和数据库字段匹配。
内容的提问来源于stack exchange,提问作者Petter Wennberg
相关产品推荐
相关产品推荐

