NHibernate QueryOver для многих таблиц

Существует объект Effort со свойством List и свойством AdType. У нас есть несколько объектов перечисления adTypes и < strong>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 для таких запросов?


person Anubis    schedule 28.12.2011    source источник
comment
Мне любопытно, что произойдет, если вы опустите клон, а также какой SQL будет запущен в базу данных?   -  person Rippo    schedule 28.12.2011
comment
Без Clone() он не будет пытаться выполнить следующее объединение усилий. Он попытается сделать это с AdType. Так что не будет .JoinQueryOver(усилия => усилия. Список), это будет .JoinQueryOver (adType => adType.....)   -  person Anubis    schedule 29.12.2011


Ответы (1)


.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>();

не то, что если вы ограничиваете только идентификатор типа объявления и списка, то

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>();
person Firo    schedule 01.01.2012