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

C# MongoDB使用LINQ查询匹配邮编的数组记录及报错修正

错误原因

报错的核心原因是Where()返回的是符合筛选条件的地址集合(IEnumerable<RetailerAddress>类型),而&&逻辑运算符要求两侧必须都是布尔值,类型不匹配直接触发错误。
另外你原来的写法漏了地址本身需要是Active状态的判断,只匹配邮编的话会把包含失效地址的商户也查出来,不符合需求。

修正方法

用Any()替代Where()做存在性判断即可:Any()返回布尔值,表示集合中是否存在至少一个满足条件的元素,MongoDB C#驱动会把这个写法自动翻译成原生的$elemMatch数组查询,性能和手写原生查询没有区别。
修正后的查询代码:

var zipCode = "09190000";
var result = await _retailerRepository.GetAsync(retailer => 
    retailer.Active 
    && retailer.Adresses.Any(address => 
        address.Active 
        && address.ZipCode == zipCode
    )
);
逻辑说明

上述代码最终生成的MongoDB查询等价于:

db.retailers.find({
  "active": true,
  "Adresses": {
    "$elemMatch": {
      "active": true,
      "ZipCode": "09190000"
    }
  }
})

查询会精准返回同时满足两个要求的记录:

  • 商户自身状态为启用(active=true)
  • 地址数组中至少存在一个启用状态、邮编匹配目标值的地址
注意事项
  • 不要用Count(筛选条件) > 0代替Any(),部分版本的MongoDB C#驱动对Count的翻译执行效率更低,Any()是数组存在性判断的最优写法。
  • 你当前实体里地址集合的属性名拼写为Adresses(标准拼写为Addresses),如果后续修改属性名记得同步配置Bson类映射,避免和MongoDB中的字段名不匹配导致查询失败。

内容的提问来源于stack exchange,提问作者Marcos Cruz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 16:09:21