如何使用F#中的字符串动态指定字段MongoDB定义



我开始使用非常强类型的定义

let coll: IMongoCollection<NZPostDataItem> = MongoUtil.getNzpostCollection()
let filter = Builders<NZPostDataItem>.Filter.And(
Builders<NZPostDataItem>.Filter.Gte((fun n -> n.dateLodged),DateTime(2020,10,1)),
Builders<NZPostDataItem>.Filter.Eq((fun n -> n.eshipMatched.Value) , true)
)// ... etc 

问题是,我需要动态运行查询,因为其中一个对象包含BSONDocument

let coll: IMongoCollection<NZPostDataItem> = MongoUtil.getNzpostCollection()
let t = Nullable<bool> true
let filter = 
FilterDefinition<BsonDocument>.op_Implicit(
"{
eshipMatched:true, 
'eship.order.carrier_service_code':'TDEAUS',
dateLodged: {$gte: new Date('01-Oct-2020')}}
)"
)

它直接在MongoDB上工作。但是当我尝试查询它时,我会得到一个编译时错误。

let results = coll.Find(filter).Limit(10000).ToList<NZPostDataItem>()

严重性代码描述项目文件行禁止显示状态错误FS0041没有与方法"Find"匹配的重载。

已知类型的参数:FilterDefinition

Available overloads:
- (extension) IMongoCollection.Find<'TDocument>(filter: FilterDefinition<'TDocument>,?options: 
FindOptions) : IFindFluent<'TDocument,'TDocument> // Argument 'filter' doesn't match
- (extension) IMongoCollection.Find<'TDocument>(filter: 
Linq.Expressions.Expression<Func<'TDocument,bool>>,?options: FindOptions) : 
IFindFluent<'TDocument,'TDocument> // Argument 'filter' doesn't match   

所以——我可以看出哪里出了问题——可能有两种类型的定义——但我需要动态过滤,但返回一个强类型对象。

正如您所说,您希望过滤器是动态的和强类型的,所以这就是您应该创建的:

let filter = 
FilterDefinition<NZPostDataItem>.op_Implicit("{ ... }")

最新更新