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?

È stato utile?

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>() );
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top