假设我有类型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类元素。
我该怎么办?
答案 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)));