首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用NHibernate.Criterion的JoinQueryOver中的"OR“限制?

使用NHibernate.Criterion的JoinQueryOver中的"OR“限制?
EN

Stack Overflow用户
提问于 2013-04-09 21:46:23
回答 1查看 1.9K关注 0票数 1

如何编写两个WhereRestrictionOn之间的OR约束?

代码语言:javascript
复制
sessao.QueryOver<Usuario>(() => usuarioAlias)
                    .WhereRestrictionOn(usr => usr.Name).IsLike(search, MatchMode.Anywhere)
                    .Inner.JoinQueryOver(() => usuarioAlias.Funcao)
                    .WhereRestrictionOn(funcao => funcao.Name).IsLike("xpto", MatchMode.Anywhere)
                    //I want the OR here
                    .WhereRestrictionOn(funcao => funcao.Name).IsLike("abcd", MatchMode.Anywhere)
                    .List();
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-09 21:58:32

有几个问题已经提供了这个问题的答案。

一种方法是使用this question的公认答案中的方法:

代码语言:javascript
复制
query.Where(Restrictions.On<Type>(x=> x.Foo).IsLike("xpto", MatchMode.Anywhere) ||
        Restrictions.On<Type>(x=> x.Foo).IsLike("abcd", MatchMode.Anywhere))

Another approach将执行以下操作:

代码语言:javascript
复制
query.RootCriteria.Add(Restrictions.Or(
  Restrictions.On<ObjectModel.Order>(x=> x.Foo).IsLike("xpto", MatchMode.Anywhere),
  Restrictions.On<ObjectModel.Order>(x=> x.Foo).IsLike("abcd", MatchMode.Anywhere)));

更新

尝试使用JoinAlias,而不是使用Inner.JoinQueryOver

代码语言:javascript
复制
Usuario usuarioAlias = null;
Funcao funcaoAlias = null;
var results = sessao.QueryOver<Usuario>(() => usuarioAlias)
      .JoinAlias(x => x.funcao, () => funcaoAlias)
      .WhereRestrictionOn(usr => usr.Name).IsLike(search, MatchMode.Anywhere)
      .Where(
          Restrictions.On<Funcao>(x => funcaoAlias.Name)
                                       .IsLike("xpto", MatchMode.Anywhere) ||
          Restrictions.On<Funcao>(x => funcaoAlias.Name)
                                       .IsLike("abcd", MatchMode.Anywhere))
       .List();

在我的测试项目中,这生成了SQL语句:

代码语言:javascript
复制
SELECT this_.Id as Id0_1_, this_.Name as Name0_1_, funcaoalia1_.Id as Id1_0_, 
       funcaoalia1_.Name as Name1_0_, funcaoalia1_.usuario_id as usuario3_1_0_ 
FROM [Usuario] this_ inner join [Funcao] funcaoalia1_ on this_.Id=funcaoalia1_.Id 
WHERE this_.Name like @p0 
 and (funcaoalia1_.Name like @p1 or funcaoalia1_.Name like @p2);
@p0 = '%test%' [Type: String (4000)], 
@p1 = '%xpto%' [Type: String (4000)], 
@p2 = '%abcd%' [Type: String (4000)]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15903674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档