使用派生类型的字段

时间:2017-01-10 02:08:19

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

我们将我们的API带入21世纪,并更新所有查询以使用更新的(2.4)Mongo C#驱动程序。我们的一个查询有这个过滤器:

Query.Or(
    Query<UserPermission>.EQ(p => p.UserId, userId),
    Query<GroupPermission>.In(p => p.GroupId, groupIds)
)

UserPermissionGroupPermission都继承自Permission。在旧的驱动程序中,这工作正常,因为底层代码只是构建了过滤器文档,而且Mongo以愉快的方式获取数据。

使用新驱动程序,我看到了类似的内容:

permissionsQueryBuilder.Or(
    userPermissionsQueryBuilder.Eq(p => p.UserId, userId),
    groupPermissionsQueryBuilder.In(p => p.GroupId, groupIds)
)

不幸的是,它不起作用,因为或期望FilterDefinition<Permission>[],两个查询元素分别返回FilterDefinition<UserPermission>FilterDefinition<GroupPermission>

使用新的Mongo驱动程序接近此问题的正确方法是什么?我搜索了Google,但搜索结果似乎主要与_t以及如何存储派生类型相关,而不是如何查询它们。

提前致谢。

1 个答案:

答案 0 :(得分:0)

使用旧驱动程序,这是不可能的,但事实证明我可以使用新驱动程序执行此操作:

permissionsQueryBuilder.Or(
    permissionsQueryBuilder.Eq(p => (p as UserPermission).UserId, userId),
    permissionsQueryBuilder.In(p => (p as GroupPermission).GroupId, groupIds)
)

当我使用as运算符时,Mongo似乎正确地编写了查询,尽管可能是标准的强制转换同样有效。