NHibernate的QueryOver与WhereRestriction为OR [英] NHibernate QueryOver with WhereRestriction as 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.AliasToBean< 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.AliasToBean< 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屋!