2011-01-28 8 views
1

Сейчас я использую API критериев и люблю его, но было бы еще лучше, если бы я мог переключиться на API QueryOver. Однако моя настройка немного странная. Для того, чтобы раздел данных в таблицы, у меня есть один базовый абстрактный класс:NHibernate-QueryOver с использованием базовых классов?

Listing 

и ряд классов, которые наследуют от:

Listing_UK 
Listing_US 
etc. 

с критериями API, я могу сделать что-то вроде:

Type t = typeof(Listing_UK); 
if (condition) t = typeof(Listing_US); 
DbSession.CreateCriteria(t) 
      .Add(Restriction.Eq("field",value) 
      .List<Listing>()); 

В принципе, используя тот же запрос для разных классов. Похоже, что сильно типизированный характер QueryOver мешает мне делать this- основной проблемы в том, что:

DBSession.QueryOver<Listing_UK>() 

не бросает в

DBSession.QueryOver<Listing> 

В то время как я понимаю, почему мне интересно если у кого-нибудь есть трюк, который я мог бы использовать для создания общего QueryOver, который по-прежнему будет нацелен на правую таблицу?

+0

Критерии использования. Они одинаковы под капотом –

+1

@ Diego - я знаю. Но QueryOver предлагает некоторые большие преимущества - в частности, проверка правильности имен полей и т. Д. При сборке. Делает это * много * проще переименовать поля. – Alastair

+1

написать единичный тест для этого тривиально. –

ответ

2

Вы можете обнаружить, вы можете использовать следующую перегрузку:

DbSession.CreateCriteria(myDynamicallyDeterminedType) 
    .Add(Restrictions.On<Listing>(l => l.field == value)) 
    .List<Listing>(); 
0

Технически это должно быть допустимо при определенных обстоятельствах. А именно, использование ковариации в C# 4 и некоторое отражение. Я считаю, что все изменения, которые потребуются, будут заключаться в том, чтобы сделать интерфейсы IQueryOver ковариантными.

subType = typeof(ParentClass).Assembly.GetType(subTypeFullName); 

var mi = typeof(QueryOver).GetMethod("Of", new Type[]{}); 
var gmi = mi.MakeGenericMethod(subType); 
var qo = (QueryOver<ParentClass, ParentClass>)gmi.Invoke(null, null); 
var queryOver = qo.GetExecutableQueryOver(session); 

// your comment restrictions/projections here. 

Я боролся с этой идеей, и до тех пор, как мы можем построить против .Net 4 он должен работать довольно легко.

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