Фильтрация объектов по подтипу с помощью NHibernate.Linq

2

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

<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

Любые идеи о том, как выражать запрос против нескольких подтипов?

  • 0
    У меня точно такая же проблема. Вы знаете, как сделать это в критериях? Когда это возможно в критериях, должно быть возможно заставить работать оператор "is".
Теги:
nhibernate
linq-to-nhibernate

2 ответа

1
Лучший ответ

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

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

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

0

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

// 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>() );
  • 1
    К сожалению, это не позволяет мне выражать запросы к базе данных. Я бы применял фильтрацию, упорядочивание и подкачку в памяти.
  • 0
    Возможно, тогда вы могли бы применить Union к базе данных (хотя и не уверены, поддерживается ли она).
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню