Учитывая это наследование:
<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
Любые идеи о том, как выражать запрос против нескольких подтипов?
Насколько я могу судить, это невозможно. Возможно, это будет в будущем. Я знаю, что они принимают исправления: -)
У меня всего около 500 записей и 4 типа, и я обычно запрашиваю 2 или 3 типа одновременно. На данный момент я применяю фильтр для каждого типа в базе данных, затем объединяю результирующие наборы и выполняю заказы и подкачки в памяти.
Это не самое эффективное решение, но работает отлично. Я решил не добавлять лишний столбец дискриминатора в таблицу пользователя только для включения этого запроса.
Что-то вроде этого:
// 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>() );