NHibernate - QueryOver используя базовые классы? - PullRequest
1 голос
/ 28 января 2011

Прямо сейчас я использую Criteria API и мне это нравится, но было бы еще лучше, если бы я мог переключиться на QueryOver API. Тем не менее, мои настройки немного странные. Чтобы разбить данные на таблицы, у меня есть один базовый абстрактный класс:

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 не позволяет мне сделать это - основная проблема заключается в следующем:

DBSession.QueryOver<Listing_UK>()

не приведен к

DBSession.QueryOver<Listing>

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

Ответы [ 2 ]

2 голосов
/ 02 февраля 2011

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

DbSession.CreateCriteria(myDynamicallyDeterminedType)
    .Add(Restrictions.On<Listing>(l => l.field == value))
    .List<Listing>();
0 голосов
/ 18 августа 2011

Технически это должно быть допустимо при определенных обстоятельствах.А именно использование ковариации в 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, она должна работать довольно красиво.без труда.

...