如何将按列对匹配的SQL自连接分组查询改写为LINQ语句
等效LINQ实现代码
以下实现完全对齐原有自连接SQL的查询逻辑,无行为差异:
var requestVersion = request.AppVersion; // 第一步:筛选符合基础条件的记录,按Articul分组取每组支持的最大安卓版本号 var groupMaxVersion = yourDbContext.BannerData .Where(b => b.AppVersionAndroid != null && b.IsEnabled == 1 && b.AppVersionAndroid <= requestVersion) .GroupBy(b => b.Articul) .Select(group => new { Articul = group.Key, MatchVersion = group.Max(item => item.AppVersionAndroid) }); // 第二步:通过组合键关联原表取完整数据行,排序后映射为DTO var response_banners = await groupMaxVersion .Join( inner: yourDbContext.BannerData, outerKeySelector: maxItem => new { maxItem.Articul, Version = maxItem.MatchVersion }, innerKeySelector: banner => new { banner.Articul, Version = banner.AppVersionAndroid }, resultSelector: (_, banner) => banner ) .OrderBy(b => b.SortIndex) .Select(b => new BannerDataDTO { Articul = b.Articul, Description = b.Description, // 剩余字段按照原有Reader映射的逻辑逐一补全即可 Id = b.Id, Title = b.Title }) .ToListAsync() .ConfigureAwait(false);
逻辑对齐说明
- 过滤规则和原SQL完全一致:仅纳入启用状态、安卓版本号非空、版本号不大于请求值的横幅记录
- 分组规则一致:按
Articul字段分组,计算每个横幅类型支持的最高适配版本 - 关联规则一致:通过
(Articul, 适配版本号)组合键匹配原表记录,避免分组后直接取FirstOrDefault带来的数据匹配错误 - 排序规则一致:最终返回结果按
SortIndex字段升序排列
注意:如果你的
AppVersionAndroid字段存储的是多段字符串格式版本号(例如2.3.1这类),直接使用数值比较、Max聚合会出现逻辑错误,需要先将字段转换为Version类型再做比较,和原有SQL的版本比较逻辑保持对齐即可。
内容的提问来源于stack exchange,提问作者Christy Pirumova
相关产品推荐
相关产品推荐

