2017-01-10 52 views
1

我们将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

一个术语nit-pick:我认为你的意思是“泛型类型”而不是“多态类型”。 – Blorgbeard

+1

@Blorgbeard注意到并更正为派生类型:) – john

回答

0

使用旧的驱动程序,这是不可能的,但事实证明,我可以简单地这样做有新的驱动程序:

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

蒙戈看来,当我使用的是运营商能够正确组合查询,尽管大概一个标准演员可以同样工作。