NHibernate QueryOver над многими таблицами - PullRequest
2 голосов
/ 28 декабря 2011

Существует объект Усилие , у которого есть свойство Список и свойство AdType У нас есть несколько adTypes перечисляемых объектов и specialLists перечисляемых объектов для выбора IList<Effort>

Я делаю это так:

    return NHibernateSession.QueryOver<Effort>()
        .JoinQueryOver(effort => effort.AdType)
                .WhereRestrictionOn(adType => adType.Id)
                .IsIn(adTypes.Select(adt => (long)adt).ToList())
            .Clone()
            .JoinQueryOver(effort => effort.List)
                .WhereRestrictionOn(list => list.Id)
                .IsIn(specialLists.Select(sl => (long)sl).ToList())
            .List<Effort>();

как вы можете видеть, я использую странный метод Clone (), у которого нет описания. Отлично работает.

Как вы используете QueryOver для таких запросов?

1 Ответ

6 голосов
/ 01 января 2012

.JoinQueryOver(effort => effort.AdType) вернет QueryOver с подтипом, здесь AdType IQueryOver<Effort, Adtype> вместо исходного IQueryOver<Effort, Effort>.Первый общий аргумент - queryType , а второй - тип, с которым работают методы.Если вы клонируете весь запрос, он копируется и возвращается как базовый запрос IQueryOver<Effort, Effort>.

Для предотвращения переключения QueryOver на подтип существует JoinAlias, который создает псевдоним вместо убывания.

AdType adAlias = null;
ListType listAlias = null;

return NHibernateSession.QueryOver<Effort>()
    .JoinAlias(effort => effort.AdType, () => adAlias)
    .JoinAlias(effort => effort.List, () => listAlias)
    .WhereRestrictionOn(() => adAlias.Id).IsIn(adTypes.Cast<long>().ToList())
    .WhereRestrictionOn(() => listAlias.Id).IsIn(specialLists.Cast<long>().ToList())
    .List<Effort>();

не то, что если вы ограничиваете только Id типа adtype и listtype, тогда

return NHibernateSession.QueryOver<Effort>()
    .WhereRestrictionOn(effort => effort.Adtype.Id).IsIn(adTypes.Cast<long>().ToList())
    .WhereRestrictionOn(effort => effort.List.Id).IsIn(specialLists.Cast<long>().ToList())
    .List<Effort>();
...