C#使用Lambda和LINQ查询获取指定动物对应地点整数ID列表
LINQ筛选目标动物对应地点ID的正确写法
现有代码的问题
你当前的查询存在两个核心错误:
Where中Contains的调用逻辑写反:q.Contains(placeIdsInputList)是尝试判断单个地点实体是否包含整个ID列表,完全不符合预期,正确逻辑是判断当前地点ID是否在传入的待查ID集合中- 缺失动物名称的筛选条件,没有加入待查动物列表的过滤规则,会返回所有传入ID对应的地点,不会过滤出你要找的动物
正确实现代码
因为你的场景是地点和动物一对一关联,直接在Where中加入两个并行的筛选条件即可,投影查询会自动处理关联属性读取,可省略不必要的Include:
var placeIdsOfAnimals = _getService.QueryWithNoTracking<Places>() .Where(q => placeIdsInputList.Contains(q.Id) && animalsInputList.Contains(q.Animal)) .Select(q => new AnimalDTO { Id = q.Id, Animal = q.Animal }) .ToList();
注意:如果你的动物名称是存在独立的Animals关联表中,而非直接存在Places表字段,将判断条件调整为
animalsInputList.Contains(q.Animal.Name)即可,属性名匹配你实际的实体定义。
逻辑说明
- 两个筛选条件是「与」关系:只会返回ID在你传入的待查地点列表中、且关联动物在你传入的待查动物列表中的记录
- 按照你给出的测试数据,最终会返回Id=3(对应Elephant)、Id=5(对应Dog)两条记录,完全符合预期
- 因为你约定了动物名称唯一、地点ID唯一,且输入地点ID数量≥输入动物数量,不会出现重复匹配或者漏匹配的问题
如果你的实体中Animals被配置成了集合类型(不符合一对一业务规则的特殊情况),将动物筛选条件替换为q.Animals.Any(a => animalsInputList.Contains(a.Name))即可正常运行。
内容的提问来源于stack exchange,提问作者cdub
相关产品推荐
相关产品推荐

