2017-01-10 50 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) 
) 

蒙戈看來,當我使用的是運營商能夠正確組合查詢,儘管大概一個標準演員可以同樣工作。