使用FilterDefinition筛选集合中的类型

本文关键字:类型 集合 FilterDefinition 筛选 使用 | 更新日期: 2023-09-27 18:14:15

当我尝试按类型/鉴别符过滤记录时,驱动程序抱怨:

var types = new List<Type> { typeof (ConcreteClassA), typeof (ConcreteClassB) };
query &= Builders<AbstractClass>.Filter.Where (obj => types.Any (type => obj.GetType ().IsInstanceOfType (type)));

value(System.Collections.Generic.List ' 1[System.Type])不支持。

即使我尝试与一种类型进行比较,也会得到一个异常:

query &= Builders<AbstractClass>.Filter.Where (obj => obj.GetType ().IsInstanceOfType (typeof (ConcreteClassA));

我知道在1。我可以使用OfType<ConcreteClassA>()解决方案。当使用FilterDefinition时是否有类似的方法?

使用FilterDefinition筛选集合中的类型

我建议你像下面这样使用OfType,这会给你FilterDefinition:

var filterTypeA = Builders<AbstractClass>.Filter.OfType<ConcreteClassA>();
var filterTypeB = Builders<AbstractClass>.Filter.OfType<ConcreteClassB>();
var filter = Builders<AbstractClass>.Filter.Or(filterA, filterB);
var result = collection.Find(filter).ToListAsync().Result;

但是你也可以像下面这样使用is运算符:

var filter = Builders<AbstractClass>.Filter
    .Where(w=> w is ConcreteClassA || w is ConcreteClassB);