使用派生类型的字段进行过滤
Filter using derived type's fields
我们将 API 带入 21 世纪,并更新我们所有的查询以使用更新的 (2.4) Mongo C# 驱动程序。我们的查询之一具有此过滤器:
Query.Or(
Query<UserPermission>.EQ(p => p.UserId, userId),
Query<GroupPermission>.In(p => p.GroupId, groupIds)
)
UserPermission
和 GroupPermission
都继承自 Permission
。在旧驱动程序中,这工作得很好,因为底层代码刚刚构建了过滤器文档并且 Mongo 继续以其愉快的方式获取数据。
有了新的驱动程序,我看到了这样的东西:
permissionsQueryBuilder.Or(
userPermissionsQueryBuilder.Eq(p => p.UserId, userId),
groupPermissionsQueryBuilder.In(p => p.GroupId, groupIds)
)
不幸的是,它不起作用,因为 Or 分别需要 FilterDefinition<Permission>[]
和两个查询元素 return FilterDefinition<UserPermission>
和 FilterDefinition<GroupPermission>
。
使用新的 Mongo 驱动程序解决这个问题的正确方法是什么?我搜索了 Google,但搜索结果似乎主要与 _t
以及如何存储派生类型有关,而不是如何查询它们。
提前致谢。
使用旧的驱动程序,这是不可能的,但事实证明我可以用新的驱动程序简单地做到这一点:
permissionsQueryBuilder.Or(
permissionsQueryBuilder.Eq(p => (p as UserPermission).UserId, userId),
permissionsQueryBuilder.In(p => (p as GroupPermission).GroupId, groupIds)
)
当我使用 as 运算符时,Mongo 似乎正确地组成了查询,尽管据推测标准转换也同样有效。
我们将 API 带入 21 世纪,并更新我们所有的查询以使用更新的 (2.4) Mongo C# 驱动程序。我们的查询之一具有此过滤器:
Query.Or(
Query<UserPermission>.EQ(p => p.UserId, userId),
Query<GroupPermission>.In(p => p.GroupId, groupIds)
)
UserPermission
和 GroupPermission
都继承自 Permission
。在旧驱动程序中,这工作得很好,因为底层代码刚刚构建了过滤器文档并且 Mongo 继续以其愉快的方式获取数据。
有了新的驱动程序,我看到了这样的东西:
permissionsQueryBuilder.Or(
userPermissionsQueryBuilder.Eq(p => p.UserId, userId),
groupPermissionsQueryBuilder.In(p => p.GroupId, groupIds)
)
不幸的是,它不起作用,因为 Or 分别需要 FilterDefinition<Permission>[]
和两个查询元素 return FilterDefinition<UserPermission>
和 FilterDefinition<GroupPermission>
。
使用新的 Mongo 驱动程序解决这个问题的正确方法是什么?我搜索了 Google,但搜索结果似乎主要与 _t
以及如何存储派生类型有关,而不是如何查询它们。
提前致谢。
使用旧的驱动程序,这是不可能的,但事实证明我可以用新的驱动程序简单地做到这一点:
permissionsQueryBuilder.Or(
permissionsQueryBuilder.Eq(p => (p as UserPermission).UserId, userId),
permissionsQueryBuilder.In(p => (p as GroupPermission).GroupId, groupIds)
)
当我使用 as 运算符时,Mongo 似乎正确地组成了查询,尽管据推测标准转换也同样有效。