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

使用Linq关联Table1、Table2查询并合并结果集的方案咨询

问题解决方案

完全可以通过纯Linq实现需求,两种实现方案的对比和参考代码如下:

纯Linq实现方案

整体逻辑是先拿到所有匹配数字的关联ID,再拉取这些ID对应的两张表全量记录,最后合并投影排序,代码参考:

// 1. 定义两张表的数字匹配过滤表达式(EF查询需要用Expression类型才能转译为SQL)
Expression<Func<Table1, bool>> T1MatchFilter = a =>
    searchNumbers.Contains(a.Digit1) 
    || searchNumbers.Contains(a.Digit2) 
    || searchNumbers.Contains(a.Digit3)
    || searchNumbers.Contains(a.Digit4) 
    || searchNumbers.Contains(a.Digit5) 
    || (_Digit6 == a.Digit6 && a.ValidFlag == 1);

Expression<Func<Table2, bool>> T2MatchFilter = a =>
    searchNumbers.Contains(a.Digit1) 
    || searchNumbers.Contains(a.Digit2) 
    || searchNumbers.Contains(a.Digit3)
    || searchNumbers.Contains(a.Digit4) 
    || searchNumbers.Contains(a.Digit5) 
    || (_Digit6 == a.Digit6 && a.ValidFlag == 1);

// 2. 拿到两个表中所有匹配数字的ID,去重合并为关联ID集合
var matchedT1Ids = db.Table1.Where(T1MatchFilter).Select(x => x.Id).Distinct().ToList();
var matchedT2Ids = db.Table2.Where(T2MatchFilter).Select(x => x.Id).Distinct().ToList();
var allRelatedIds = matchedT1Ids.Union(matchedT2Ids).ToList();

// 3. 分别查询两张表中所有关联ID对应的有效记录,投影为统一的视图模型
var t1Result = db.Table1
    .Where(x => allRelatedIds.Contains(x.Id) && x.ValidFlag == 1)
    .Select(x => new YourViewModel
    {
        Id = x.Id,
        Source = "Table1",
        // 按需映射其他字段,排序用的字段保持两个表统一
        SortKey = x.CreateTime
    }).ToList();

var t2Result = db.Table2
    .Where(x => allRelatedIds.Contains(x.Id) && x.ValidFlag == 1)
    .Select(x => new YourViewModel
    {
        Id = x.Id,
        Source = "Table2",
        // 按需映射其他字段
        SortKey = x.CreateTime
    }).ToList();

// 4. 合并后按降序排序得到最终结果
var finalResult = t1Result.Concat(t2Result).OrderByDescending(x => x.SortKey).ToList();

注意事项

你原有代码的过滤逻辑中,只有Digit6匹配时才会校验ValidFlag == 1,其他Digit字段匹配时不会校验该标识,如果这不符合业务预期,建议调整优先级,把ValidFlag校验提到最外层:

Where(a => (数字匹配的所有或条件) && a.ValidFlag == 1)

存储过程CTE实现方案

如果选择存储过程实现,逻辑和Linq的思路完全一致:

  1. 先写CTE1查询Table1的匹配ID,CTE2查询Table2的匹配ID
  2. CTE3合并两个CTE的ID去重
  3. 用CTE3分别关联Table1和Table2查全量有效记录
  4. UNION两个结果集后排序返回
    通过EF调用存储过程直接接收强类型视图模型即可。

方案选择建议

  • 优先选纯Linq实现:如果你的项目数据量不大(单次匹配ID不超过1000),业务逻辑都放在代码层维护,Linq方案无需额外维护存储过程代码,版本管理、调试都更方便,性能和存储过程差异不大。
  • 选存储过程的场景:如果匹配的ID量级很大(超过1万),Linq生成的IN语句会有性能瓶颈,或者需要做精细的SQL执行计划调优,再考虑用存储过程方案。

内容的提问来源于stack exchange,提问作者1moreLearner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 08:51:02