使用FilterDefinition

时间:2015-09-22 18:11:21

标签: c# mongodb-.net-driver

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

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时是否有类似的方法?

1 个答案:

答案 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);