2 Stimmen

Filtern von Entitäten nach Untertyp mit NHibernate.Linq

Angesichts dieser Vererbungszuordnung:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
    <class name="User" table="[User]" abstract="true">
        <joined-subclass name="SubUser1" table="SubUser1">
            <key column="UserId" />
            ...
        </joined-subclass>
        <joined-subclass name="SubUser2" table="SubUser2">
            <key column="UserId" />
            ...
        </joined-subclass>
        <joined-subclass name="SubUser3" table="SubUser3">
            <key column="UserId" />
            ...
        </joined-subclass>
    </class>
</hibernate-mapping>

wie suche ich nach allen Instanzen von SubUser2 y SubUser3 ? Mir ist klar, dass ich das tun kann:

session.Linq<User>().OfType<SubUser2>()

aber das erlaubt mir nur, nach einem einzigen Typ zu filtern. Ich habe dies versucht:

session.Linq<User>().Where(user => user is SubUser2)

aber das führte zu diesem Fehler:

could not resolve property:  of: User

Irgendwelche Ideen, wie man eine Abfrage über mehrere Untertypen ausdrücken kann?

1voto

Bryan Watts Punkte 43539

Soweit ich das beurteilen kann, ist dies nicht möglich. Vielleicht wird es in Zukunft möglich sein. Ich weiß, dass sie Patches akzeptieren :-)

Ich habe nur etwa 500 Datensätze und 4 Typen, und ich frage normalerweise 2 oder 3 Typen gleichzeitig ab. Im Moment wende ich den Filter auf jeden Typ in der Datenbank an, verkette dann die Ergebnissätze und führe Bestellung und Paging im Speicher durch.

Es ist nicht die effizienteste Lösung, aber sie funktioniert gut. Ich habe mich dafür entschieden, der Tabelle "User" keine überflüssige Diskriminatorspalte hinzuzufügen, nur um diese Abfrage zu ermöglichen.

0voto

Dmytrii Nagirniak Punkte 22868

Wie wäre es mit so etwas wie diesem:

// Get them in 2 queries
var sub2 = session.Linq<SubUser2>().Select(x => x).ToList();
var sub3 = session.Linq<SubUser3>().Select(x => x).ToList();

// Join together in memory
var sub2And3 = sub2.OfType<User>().Union( sub3.OfType<User>() );

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X