使用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的思路完全一致:
- 先写CTE1查询Table1的匹配ID,CTE2查询Table2的匹配ID
- CTE3合并两个CTE的ID去重
- 用CTE3分别关联Table1和Table2查全量有效记录
- UNION两个结果集后排序返回
通过EF调用存储过程直接接收强类型视图模型即可。
方案选择建议
- 优先选纯Linq实现:如果你的项目数据量不大(单次匹配ID不超过1000),业务逻辑都放在代码层维护,Linq方案无需额外维护存储过程代码,版本管理、调试都更方便,性能和存储过程差异不大。
- 选存储过程的场景:如果匹配的ID量级很大(超过1万),Linq生成的IN语句会有性能瓶颈,或者需要做精细的SQL执行计划调优,再考虑用存储过程方案。
内容的提问来源于stack exchange,提问作者1moreLearner
相关产品推荐
相关产品推荐

