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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 04:54:03