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
相关产品推荐
相关产品推荐

