我开始使用非常强类型的定义
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("{ ... }")