Фильтрация объектов по подтипу с помощью NHibernate.Linq - PullRequest
2 голосов
/ 06 августа 2009

Учитывая это отображение наследования:

<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>

как запросить все экземпляры SubUser2 и SubUser3? Я понимаю, что могу сделать это:

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

но это позволяет мне фильтровать только по одному типу. Я попробовал это:

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

но это привело к этой ошибке:

could not resolve property:  of: User

Есть идеи, как выразить запрос к нескольким подтипам?

Ответы [ 2 ]

1 голос
/ 30 августа 2009

Насколько я могу судить, это невозможно. Возможно, это будет в будущем. Я знаю, что они принимают патчи: -)

У меня всего около 500 записей и 4 типов, и я обычно запрашиваю 2 или 3 типа одновременно. Сейчас я применяю фильтр для каждого типа в базе данных, затем объединяю результирующие наборы и выполняю упорядочивание и разбиение на страницы в памяти.

Это не самое эффективное решение, но оно работает просто отлично. Я решил не добавлять лишний столбец дискриминатора в таблицу User исключительно для включения этого запроса.

0 голосов
/ 30 августа 2009

Что-то вроде этого:

// 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>() );
...