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

MongoDB .Net Driver使用FilterBuilder构建查询抛出异常如何解决

异常原因

  • C# 版 MongoDB 驱动不支持将内存集合与数据库文档做嵌套 Any 匹配的 Linq 逻辑,无法将该类表达式翻译为原生 MongoDB 查询语句,这是抛出异常的核心原因。
  • 你的代码本身存在多处基础语法错误:
    1. Record 类中 public Data { get; set; } 写法错误,缺少属性类型。
    2. 筛选表达式中错误使用了不存在的属性 x.Name、y.Name,你的 Name 类和 Record 类都只有 FirstName、LastName 属性。
    3. 列表初始化时类型写法错误,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:48:03