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

如何将按列对匹配的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 13:45:31