NHibernate Criteria中的And, Or
NHibernate Criteria中的And, Or
public IList<BoxDao> QueryRelated(TemplateDao[] templates, DataSourceDao[] datasources)
{
ICriteria criteria = this._session.CreateCriteria(typeof(BoxDao));
Expression.ICriterion exp = null;
exp = Expression.Or(Expression.In("Template", templates), Expression.In("Wrapper", templates));
exp = Expression.Or(exp, Expression.In("DataSource", datasources));
exp = Expression.And(exp, Expression.In("State", new EnumState[] { EnumState.Publish, EnumState.Edit }));
criteria.Add(exp);
return criteria.List<BoxDao>();
}
{
ICriteria criteria = this._session.CreateCriteria(typeof(BoxDao));
Expression.ICriterion exp = null;
exp = Expression.Or(Expression.In("Template", templates), Expression.In("Wrapper", templates));
exp = Expression.Or(exp, Expression.In("DataSource", datasources));
exp = Expression.And(exp, Expression.In("State", new EnumState[] { EnumState.Publish, EnumState.Edit }));
criteria.Add(exp);
return criteria.List<BoxDao>();
}
如果参数templates、datasources都不为null,执行的SQL如下:http://dwz.date/dwWb
SELECT ...
FROM CMS_BOX this_
WHERE ((this_.TEMP_ID in (?p0) or this_.WRAPPER_ID in (?p1)) or this_.DS_ID in (?p2)) and this_.BOX_STATE in (?p3, ?p4)
FROM CMS_BOX this_
WHERE ((this_.TEMP_ID in (?p0) or this_.WRAPPER_ID in (?p1)) or this_.DS_ID in (?p2)) and this_.BOX_STATE in (?p3, ?p4)
假如templates为null,执行的SQL如下
SELECT ...
FROM CMS_BOX this_
WHERE ((1=0 or 1=0) or this_.DS_ID in (?p0)) and this_.BOX_STATE in (?p1, ?p2, ?p3)
FROM CMS_BOX this_
WHERE ((1=0 or 1=0) or this_.DS_ID in (?p0)) and this_.BOX_STATE in (?p1, ?p2, ?p3)
对这种组合的And、Or条件,一开始担心null值会引起NHibernate的异常,所以自己判断参数是否为null来确定怎样使用And、Or,写出来的代码很复杂,测试一下发现NHibernate能够处理数组为null的异常情况,因此代码简单多了。
可以看到,当数组为null时,NHibernate使用一个1=0的表达式,这正是我要的效果,因此可以省略null判断,否则还是需要自己处理的。
可以使用HQL,不过HQL不支持null参数,参数的个数为0也不行。
public IList<BoxDao> QueryRelated(IList<TemplateDao> templates, IList<DataSourceDao> datasources)
{
IList<EnumState> states = new List<EnumState>(2);
states.Add(EnumState.Publish);
states.Add(EnumState.Edit);
return this._session.CreateQuery(@"from BoxDao p
where (p.Template in :templates or p.Wrapper in :templates or p.DataSource in :datasources) and p.State in :states")
.SetParameterList("templates", templates)
.SetParameterList("datasources", datasources)
.SetParameterList("states", states)
.List<BoxDao>();
}
{
IList<EnumState> states = new List<EnumState>(2);
states.Add(EnumState.Publish);
states.Add(EnumState.Edit);
return this._session.CreateQuery(@"from BoxDao p
where (p.Template in :templates or p.Wrapper in :templates or p.DataSource in :datasources) and p.State in :states")
.SetParameterList("templates", templates)
.SetParameterList("datasources", datasources)
.SetParameterList("states", states)
.List<BoxDao>();
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!