C# 使用Linq筛选两个无关联不同实体集合属性匹配的元素
正确实现方案
你给出的伪代码错误原因是
Contains方法需要传入的是集合元素类型的实例,而非布尔判断表达式,因此无法直接生效。
1. 内存集合查询(Linq to Objects)
基础写法(适合小数据量)
直接用Any判断B集合是否存在匹配项即可满足需求:
// 假设两个实体的匹配属性名为TargetProperty,属性名不同可自行替换 var result = listOfEntityA.Where(a => listOfEntityB.Any(b => b.TargetProperty == a.TargetProperty)).ToList();
高性能写法(适合B集合数据量大的场景)
提前提取B的属性值构造HashSet,将匹配复杂度从O(n*m)降到O(n):
// 提取B集合的所有匹配属性值到HashSet,示例属性类型为int,可按需替换 var bValueSet = new HashSet<int>(listOfEntityB.Select(b => b.TargetProperty)); // 直接用Contains匹配 var result = listOfEntityA.Where(a => bValueSet.Contains(a.TargetProperty)).ToList();
2. EF Core 数据库查询(Linq to Entities)
如果是操作DbContext的数据库查询场景,直接投影B的属性值为普通集合后使用Contains,EF会自动转换为SQL的IN语句执行:
// 先取出所有EntityB的匹配属性值到本地集合 var bPropertyValues = MyContext.ListOfEntityB.Select(b => b.TargetProperty).ToList(); // 查询符合条件的EntityA var result = MyContext.ListOfEntityA.Where(a => bPropertyValues.Contains(a.TargetProperty)).ToList();
示例场景验证
按你给出的测试用例:
- ListOfEntityA的TargetProperty值为 [1,2]
- ListOfEntityB的TargetProperty值为 [2]
以上所有写法返回的结果都是TargetProperty为2的EntityA元素,完全符合预期。
内容的提问来源于stack exchange,提问作者Chris Halcrow
相关产品推荐
相关产品推荐

