MongoDB .Net Driver使用FilterBuilder构建查询抛出异常如何解决
异常原因
- C# 版 MongoDB 驱动不支持将内存集合与数据库文档做嵌套
Any匹配的 Linq 逻辑,无法将该类表达式翻译为原生 MongoDB 查询语句,这是抛出异常的核心原因。 - 你的代码本身存在多处基础语法错误:
Record类中public Data { get; set; }写法错误,缺少属性类型。- 筛选表达式中错误使用了不存在的属性
x.Name、y.Name,你的Name类和Record类都只有FirstName、LastName属性。 - 列表初始化时类型写法错误,
List<Names>应为List<Name>。
解决方案
首先修正基础语法错误,再通过拼接多条件的方式构建筛选规则:
// 修正后的实体定义 public class Record { [BsonId] public ObjectId Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } // 按需补全Data属性定义,如无必要可直接删除 // public object Data { get; set; } } public class Name { public string FirstName { get; set; } public string LastName { get; set; } } // 修正后的列表初始化 var Names = new List<Name> { new Name { FirstName = "abc", LastName = "xyz" }, new Name { FirstName = "123", LastName = "789" }, new Name { FirstName = "a1b2", LastName = "c7d8" } };
构建筛选条件的正确写法:
// 为每个Name生成对应的FirstName+LastName匹配条件 var singleFilters = Names.Select(nameItem => Builders<Record>.Filter.And( Builders<Record>.Filter.Eq(r => r.FirstName, nameItem.FirstName), Builders<Record>.Filter.Eq(r => r.LastName, nameItem.LastName) ) ); // 用Or拼接所有条件,命中任意一个即符合要求 FilterDefinition<Record> patentFilter = Builders<Record>.Filter.Or(singleFilters);
该写法可以被驱动正常翻译为 MongoDB 原生的 $or 查询语句,执行不会报错。
内容的提问来源于stack exchange,提问作者Chand
相关产品推荐
相关产品推荐

