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

MongoDB C# 2.14 Driver中Filter.In传入lambda表达式无法编译问题

MongoDB C# 驱动 Filter.In 传入数组字段 lambda 无法编译问题解答

结论

这是 MongoDB C# 驱动的预期设计,并非 Bug。

原因说明

Filter.In 的强类型 lambda 重载签名如下:

FilterDefinition<TDocument> In<TField>(
    Expression<Func<TDocument, TField>> field, 
    IEnumerable<TField> values
)

该方法的泛型约束要求:lambda 表达式返回的字段类型,必须和值列表的元素类型完全一致。
你传入的 lambda movie => movie.Genres 返回的是集合类型(如 List<string> 或 string[]),而你传入的值列表 genres 是 string[] 类型。此时泛型推导会把 TField 判定为集合类型,要求值列表的元素也必须是同类型的集合,和你实际传入的 string 类型值列表不匹配,因此编译失败。
而你用字符串、nameof 传字段名的重载没有编译期类型校验,所以可以正常编译,运行时生成的查询语句 { genres: { $in: ["one","two","three"] } } 完全符合 MongoDB 原生语义,可以正常返回数组字段包含任意匹配值的文档。

强类型写法解决方案

如果要保留 lambda 强类型的开发方式,不需要用 In 方法,改用专门针对数组字段的 AnyIn 方法即可:

// 可正常编译,语义和 filter2、filter3 完全一致
var filter4 = Builders<Movie>.Filter.AnyIn(movie => movie.Genres, genres);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 13:36:03