NHibernate QueryOver 与 WhereRestriction 作为 OR [英] NHibernate QueryOver with WhereRestriction as OR
本文介绍了NHibernate QueryOver 与 WhereRestriction 作为 OR的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有这个查询,但我似乎无法找到如何将我的 WhereRestrictionOn 设置为 OR.现在它们起到 AND 的作用,但我想要一个或另一个.
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();
非常感谢任何帮助!
解决方案:
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();
推荐答案
顶级.Where()
族(包括WhereRestrictionOn
)总是与 AND 连接.所以我们必须明确地使用类似的东西:
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))
)
正如这里所讨论的:16.2.简单表达式,对于简单的东西,我们甚至可以使用 ||
(引用小例子):
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屋!
查看全文