2017-01-10 4 views
1

Wir bringen unsere API in das 21. Jahrhundert und aktualisieren alle unsere Abfragen, um den neueren (2.4) Mongo C# -Treiber zu verwenden. Einer unserer Anfragen hat diese Filter:Filter mit den Feldern des abgeleiteten Typs

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

UserPermission und GroupPermission erben beide von Permission. Im alten Treiber funktionierte das gut, da der zugrundeliegende Code das Filterdokument nur erstellt hatte und Mongo ging auf seine fröhliche Art, die Daten zu holen.

Mit dem neuen Treiber, ich habe auf etwas so aussehen:

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

Leider ist es nicht funktioniert, weil Oder FilterDefinition<Permission>[] und die beiden Abfrageelemente, die jeweils das Rück FilterDefinition<UserPermission> und FilterDefinition<GroupPermission> erwartet.

Was ist der richtige Weg, um dies mit dem neuen Mongo-Treiber zu erreichen? Ich habe Google durchsucht, aber die Suchergebnisse scheinen sich weitgehend auf _t zu beziehen und wie abgeleitete Typen gespeichert werden, im Gegensatz dazu, wie sie abgefragt werden.

Vielen Dank im Voraus.

+1

Eine Terminologie Nissen-Auswahl: Ich denke, Sie meinen "generische Typen" eher als "polymorphe Typen". – Blorgbeard

+1

@Blorgbeard Notiert und zu abgeleiteten Typen korrigiert :) – john

Antwort

0

die alten Treiber verwenden, war dies nicht möglich, aber es stellt sich heraus, ich kann einfach dies mit dem neuen Treiber:

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

Mongo scheint richtig, die Abfrage zu komponieren, wenn ich das als Operator verwenden, obwohl vermutlich eine Standardbesetzung gleich gut funktionieren würde.

Verwandte Themen