NHibernate的QueryOver与WhereRestriction为OR [英] NHibernate QueryOver with WhereRestriction as OR

查看:904
本文介绍了NHibernate的QueryOver与WhereRestriction为OR的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这个疑问,但我似乎无法找到我怎么设置我WhereRestrictionOn为OR。现在,他们的功能,但我想一个或另一个。

  VAR privateInfo = Session.QueryOver< ConContact>()
            .JoinAlias​​(C => c.PrivateInfos,()=> PI)的
            .WhereRestrictionOn(C => c.FirstName).IsLike(_selectedFirstLetter +%)
            .WhereRestrictionOn(C => c.LastName).IsLike(_selectedFirstLetter +%)// TODO:更改名字或姓氏
            。凡(C => c.Status == ContactStatus.Approved)
            。选择(
                Projections.Property(pi.Id)WithAlias​​(()=> sri.Id),
                。Projections.Property(名字)WithAlias​​(()=> sri.Name),// TODO:拿到全名在这里= GT;添加concontact对象privateinfo
                Projections.Property(pi.Address)WithAlias​​(()=> sri.Address),
                。Projections.Constant(联系方式)WithAlias​​(()=> sri.Type)
            )
            .TransformUsing(Transformers.Alias​​ToBean< SearchResultInfo>())
            .LIST< SearchResultInfo>()
            .ToList();

任何帮助很多AP preciated THX!

解决方案:

  VAR privateInfo = Session.QueryOver< ConContact>()
            .JoinAlias​​(C => c.PrivateInfos,()=> PI)的
            。哪里(
                Restrictions.Disjunction()
                    。新增(Restrictions.Like(名字,_selectedFirstLetter +%))
                    。新增(Restrictions.Like(姓氏,_selectedFirstLetter +%))
            )
            。凡(C => c.Status == ContactStatus.Approved)
            。选择(
                Projections.Property(pi.Id)WithAlias​​(()=> sri.Id),
                。Projections.Property(名字)WithAlias​​(()=> sri.Name),// TODO:拿到全名在这里= GT;添加concontact对象privateinfo
                Projections.Property(pi.Address)WithAlias​​(()=> sri.Address),
                Projections.Constant(NewObjectType.Contact).WithAlias​​(()=> sri.Type)
            )
            .TransformUsing(Transformers.Alias​​ToBean< SearchResultInfo>())
            .LIST< SearchResultInfo>()
            .ToList();


解决方案

顶级。凡()家庭的(包括 WhereRestrictionOn 的始终是合并接合。因此,我们必须明确地使用这样的:


  • Restrictions.Or(restriction1,restriction1)

  • Restrictions.Disjunction()。添加(restriction1)。新增(restriction2)。新增(...

所以,这可能是我们的情况:

 。凡(
    Restrictions.Disjunction()
        。新增(Restrictions.On< ConContact>(C => c.FirstName)
                              .IsLike(_selectedFirstLetter,MatchMode.Start))
        。新增(Restrictions.On< ConContact>(C => c.LastName)
                              .IsLike(_selectedFirstLetter,MatchMode.Start))
        //更多或...
        //.Add(Restrictions.On<ConContact>(c =&GT; c.MiddleName)
        // .IsLike(_selectedFirstLetter,MatchMode.Start))

因为这里所讨论: 16.2。简单的防爆pressions 的,简单的东西,我们甚至可以使用|| (举个小例子)的:

 。凡(P =&GT; p.Name ==测试名称&放大器;及(p.Age&GT; 21 || p.HasCar))

I have this query but I can't seem to find how I set my WhereRestrictionOn as an OR. Now they function as AND but I want one OR the other.

var privateInfo = Session.QueryOver<ConContact>()
            .JoinAlias(c => c.PrivateInfos, () => pi)
            .WhereRestrictionOn(c => c.FirstName).IsLike(_selectedFirstLetter + "%")
            .WhereRestrictionOn(c => c.LastName).IsLike(_selectedFirstLetter + "%") // todo: change to firstname OR lastname
            .Where(c => c.Status == ContactStatus.Approved)
            .Select(
                Projections.Property("pi.Id").WithAlias(() => sri.Id),
                Projections.Property("FirstName").WithAlias(() => sri.Name), //todo: get fullname here => Add concontact object in privateinfo
                Projections.Property("pi.Address").WithAlias(() => sri.Address),
                Projections.Constant("Contact").WithAlias(() => sri.Type)
            )
            .TransformUsing(Transformers.AliasToBean<SearchResultInfo>())
            .List<SearchResultInfo>()
            .ToList();

Any help is much appreciated thx!

SOLUTION:

var privateInfo = Session.QueryOver<ConContact>()
            .JoinAlias(c => c.PrivateInfos, () => pi)
            .Where(
                Restrictions.Disjunction()
                    .Add(Restrictions.Like("FirstName", _selectedFirstLetter + "%"))
                    .Add(Restrictions.Like("LastName", _selectedFirstLetter + "%"))
            )
            .Where(c => c.Status == ContactStatus.Approved)
            .Select(
                Projections.Property("pi.Id").WithAlias(() => sri.Id),
                Projections.Property("FirstName").WithAlias(() => sri.Name), //todo: get fullname here => Add concontact object in privateinfo
                Projections.Property("pi.Address").WithAlias(() => sri.Address),
                Projections.Constant(NewObjectType.Contact).WithAlias(() => sri.Type)
            )
            .TransformUsing(Transformers.AliasToBean<SearchResultInfo>())
            .List<SearchResultInfo>()
            .ToList();

解决方案

The top level .Where() family (including WhereRestrictionOn) is always joined with AND. So we have to explicitly use something like:

  • Restrictions.Or(restriction1, restriction1)
  • Restrictions.Disjunction().Add(restriction1).Add(restriction2).Add(...

So, this could be our case:

.Where(
    Restrictions.Disjunction()
        .Add(Restrictions.On<ConContact>(c => c.FirstName)
                              .IsLike(_selectedFirstLetter, MatchMode.Start))
        .Add(Restrictions.On<ConContact>(c => c.LastName)
                              .IsLike(_selectedFirstLetter, MatchMode.Start))
        // more OR ...
        //.Add(Restrictions.On<ConContact>(c => c.MiddleName)
        //                      .IsLike(_selectedFirstLetter, MatchMode.Start))
)

As discussed here: 16.2. Simple Expressions, for simple stuff we can even use || (cited small example):

.Where(p => p.Name == "test name" && (p.Age > 21 || p.HasCar))

这篇关于NHibernate的QueryOver与WhereRestriction为OR的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆