我想OR-结合两个限制,一个与父母相关,一个与孩子相关。
我有以下代码:
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
不幸的是,这两个限制之间存在AND-conject:
this_.Name like '%dim%' and customer1_.Name like '%dim%'
我想改为OR,就像这样:
this_.Name like '%dim%' or customer1_.Name like '%dim%'
如何使用新的QueryOver API解决此查询?
答案 0 :(得分:3)
您需要使用别名。
完整的查询应该是:
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;