2009-08-06 2 views
2

Учитывая это отображение наследования:Фильтрующие объекты по подтипу с NHibernate.Linq

<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» работать. – Paco

ответ

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 в базе данных (хотя не уверены, что он поддерживается). –

+0

Я пробовал, когда читаю ваш ответ, Union не поддерживается. –

Смежные вопросы