如何将含MAX子查询的SQL语句转换为LINQ查询?
解决方案
你可以在LINQ的where子句中嵌入子查询,实现原SQL中获取MAX(ResultIdentifier)的逻辑。以下是完整的转换后的LINQ查询:
var thirtyDaysAgo = DateTime.Now.AddDays(-30); var failures = from result in db.Results join transact in db.Transacts on result.ID equals transact.ID join product in db.Products on transact.ProductID equals product.ProductID where result.ResultIdentifier == ( from r2 in db.Results where r2.Status == "Fail" && r2.ID == result.ID && r2.Start >= thirtyDaysAgo select r2.ResultIdentifier ).Max() && product.ProductID == 9 select new { ID = transact.ID, ResultIdentifier = result.ResultIdentifier, ProductID = product.ProductID, Status = result.Status, Start = result.Start };
关键说明
- 提前计算
thirtyDaysAgo,避免子查询中重复计算,同时让代码更简洁清晰。 - 子查询完全对应原SQL逻辑:针对当前
result的ID,筛选出状态为Fail、时间在最近30天内的记录,再取ResultIdentifier的最大值。 - 最后添加
product.ProductID == 9的筛选条件,匹配原SQL中的p.productID = 9。
性能优化写法(预查询分组)
如果数据量较大,上面的写法可能因每条记录执行一次子查询导致性能问题,可先预查询每个ID对应的最大ResultIdentifier,再关联查询:
var thirtyDaysAgo = DateTime.Now.AddDays(-30); // 预查询每个ID对应的符合条件的最大ResultIdentifier var maxResultIds = from r2 in db.Results where r2.Status == "Fail" && r2.Start >= thirtyDaysAgo group r2 by r2.ID into g select new { ID = g.Key, MaxResultIdentifier = g.Max(x => x.ResultIdentifier) }; // 关联查询获取最终结果 var failures = from result in db.Results join maxResult in maxResultIds on new { result.ID, result.ResultIdentifier } equals new { maxResult.ID, maxResult.MaxResultIdentifier } join transact in db.Transacts on result.ID equals transact.ID join product in db.Products on transact.ProductID equals product.ProductID where product.ProductID == 9 select new { ID = transact.ID, ResultIdentifier = result.ResultIdentifier, ProductID = product.ProductID, Status = result.Status, Start = result.Start };
这种写法先通过分组获取每个ID的目标最大值,再关联主查询,能减少重复子查询的执行次数,提升查询效率。
内容的提问来源于stack exchange,提问作者m_finn
相关产品推荐
相关产品推荐

