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

