对子类型的查询

时间:2014-07-08 13:56:39

标签: c# .net mongodb mongodb-.net-driver

假设我有类型A和B,其中B是A的子类型,p是A的公共属性。

构建查询时:

Query<B>.EQ(b => b.p, x)

我希望只比较B类对象中的p属性,但我发现构建的查询是

{ p: x }

应用于Collection中的所有项目(A和B),因此不使用类型鉴别器。 我知道OfType()LINQ在查询中添加了类型鉴别器,但它只适用于查询,而不适用于删除或更新。

示例:

class A
{
   public int p;
}

class B : A
{
  public int q;
}

查询:

Collection.AsQueryable<A>().OfType<B>().where(b => p == x)

返回类型B的所有元素,其中p等于x,但命令:

Collection.Remove(Query<B>.EQ(b => b.p, x))

删除类型为A和B的所有元素,其中p等于x。 我想只删除B类元素。

我该怎么办?

1 个答案:

答案 0 :(得分:0)

MongoDB驱动程序中的泛型仅为易用性而存在,它没有实际的操作效果。

您需要做的是使用过滤器和类型鉴别器约束构建查询。要实现这一点,您需要类型过滤器(它不是通用的,您需要自己指定鉴别器)和QueryBuilder将两个过滤器组合在一起:

var builder = new QueryBuilder<B>();
Collection.Remove(builder.And(Query<B>.EQ(b => b.p, x), Query.EQ("_t", typeof(B).Name)));