NHibernate QueryOver: Разъединение с ограничением в соединении - PullRequest
2 голосов
/ 05 марта 2011

Я хотел бы объединить два ИЛИ, два ограничения, одно из которых относится к родителю, другое относится к ребенку.

У меня есть следующий код:

var query = Session.QueryOver<Project>()
            .Where(x => x.AccountId == Scope.AccountId)
            .And(x => x.Archived != active)
            .AndRestrictionOn(x => x.Name).IsLike("%" + text + "%")
            .JoinQueryOver(x => x.Customer)
                .WhereRestrictionOn(c => c.Name).IsLike("%" + text + "%")
            .OrderBy(x => x.Id).Desc
            .Fetch(x => x.Customer).Eager;

SQL-вывод:

SELECT   this_.Id              as Id2_1_,
         this_.Account_id      as Account2_2_1_,
         this_.Name            as Name2_1_,
         this_.Info            as Info2_1_,
         this_.Archived        as Archived2_1_,
         this_.Customer_id     as Customer6_2_1_,
         customer1_.Id         as Id1_0_,
         customer1_.Account_id as Account2_1_0_,
         customer1_.Name       as Name1_0_
FROM     [Project] this_
         inner join [Customer] customer1_
           on this_.Customer_id = customer1_.Id
WHERE    this_.Account_id = 5 /* @p0 */
         and not (this_.Archived = 1 /* @p1 */)
         and this_.Name like '%dim%' /* @p2 */
         and customer1_.Name like '%dim%' /* @p3 */
ORDER BY customer1_.Id desc

К сожалению, между этими двумя ограничениями есть И-конъюнкция:

this_.Name like '%dim%' and customer1_.Name like '%dim%'

Я бы хотел использовать ИЛИ, вот так:

this_.Name like '%dim%' or customer1_.Name like '%dim%'

Как я могу решить этот запрос с новым API QueryOver?

1 Ответ

3 голосов
/ 07 марта 2011

Вам нужно будет использовать псевдонимы.

Полный запрос должен быть:

Customer customerAlias = null;

/* 1st - create base query */
var query = Session.QueryOver<Project>()
            .JoinAlias(x => x.Customer, () => customerAlias)
            .Where(x => x.AccountId == Scope.AccountId)
            .Where(x => x.Archived != active);

/* 2nd - create the disjunction */
var disjunction = new Disjunction();

disjunction.Add(Restrictions.On<Project>(p => p.Name).IsLike(text, MatchMode.Anywhere));
disjunction.Add(Restrictions.On(() => customerAlias.Name).IsLike(text, MatchMode.Anywhere));

/* 3rd - complete query */
query = query.Where(disjunction)                
             .OrderBy(x => x.Id).Desc;
...