当我尝试按类型/鉴别器过滤记录时,驱动程序会抱怨:
var types = new List<Type> { typeof (ConcreteClassA), typeof (ConcreteClassB) };
query &= Builders<AbstractClass>.Filter.Where (obj => types.Any (type => obj.GetType ().IsInstanceOfType (type)));
值(System.Collections.Generic.List`1 [System.Type])不受支持。
即使我尝试与一种类型进行比较,我也会遇到异常:
query &= Builders<AbstractClass>.Filter.Where (obj => obj.GetType ().IsInstanceOfType (typeof (ConcreteClassA));
我知道在1.x驱动程序中我可以使用OfType<ConcreteClassA>()
解决方案。使用FilterDefinition
时是否有类似的方法?
答案 0 :(得分:1)
我建议您使用下面的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);