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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 06:31:27