Filtraggio entità dal sottotipo con NHibernate.Linq
-
11-09-2019 - |
Domanda
Dato questo mappatura eredità:
<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>
Come faccio a eseguire una query per tutte le istanze di SubUser2
e SubUser3
? Mi rendo conto che posso fare questo:
session.Linq<User>().OfType<SubUser2>()
, ma che consente solo me per filtrare per un unico tipo. Ho provato questo:
session.Linq<User>().Where(user => user is SubUser2)
, ma che ha portato in questo errore:
could not resolve property: of: User
Tutte le idee su come esprimere una query su più sottotipi?
Soluzione
Per quanto posso dire, questo non è possibile. Forse sarà in futuro. So che accettano patch: -)
Ho solo circa 500 dischi e 4 tipi, e sono di solito l'esecuzione di query su 2 o 3 tipi allo stesso tempo. Per ora, sto applicando il filtro su ogni tipo nel database, quindi concatenando i set di risultati e di fare ordine e di paging in memoria.
Non è la soluzione più efficiente, ma funziona bene. Ho scelto di non aggiungere una colonna discriminatore superfluo alla tabella utente esclusivamente per consentire questa query.
Altri suggerimenti
Che dire qualcosa di simile:
// 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>() );