NHibernate Criteria中如何使用And和Or进行条件组合?
- 内容介绍
- 文章标签
- 相关推荐
本文共计360个文字,预计阅读时间需要2分钟。
public IList QueryRelated(TemplateDao[] templates, DataSourceDao[] datasources){ ICriteria criteria=this._session.CreateCriteria(typeof(BoxDao)); ICriterion exp=null; exp=Expression.Or(Expression.In(Template, templates), Expression.In(DataSource, datasources)); criteria.Add(exp); return criteria.List();}
{
ICriteriacriteria=this._session.CreateCriteria(typeof(BoxDao));
Expression.ICriterionexp=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);
returncriteria.List<BoxDao>();
}
如果参数templates、datasources都不为null,执行的SQL如下
SELECT...
FROMCMS_BOXthis_
WHERE((this_.TEMP_IDin(?p0)orthis_.WRAPPER_IDin(?p1))orthis_.DS_IDin(?p2))andthis_.BOX_STATEin(?p3,?p4)
假如templates为null,执行的SQL如下
SELECT...
FROMCMS_BOXthis_
WHERE((1=0or1=0)orthis_.DS_IDin(?p0))andthis_.BOX_STATEin(?p1,?p2,?p3)
对这种组合的And、Or条件,一开始担心null值会引起NHibernate的异常,所以自己判断参数是否为null来确定怎样使用And、Or,写出来的代码很复杂,测试一下发现NHibernate能够处理数组为null的异常情况,因此代码简单多了。
可以看到,当数组为null时,NHibernate使用一个1=0的表达式,这正是我要的效果,因此可以省略null判断,否则还是需要自己处理的。
可以使用HQL,不过HQL不支持null参数,参数的个数为0也不行。
publicIList<BoxDao>QueryRelated(IList<TemplateDao>templates,IList<DataSourceDao>datasources)
{
IList<EnumState>states=newList<EnumState>(2);
states.Add(EnumState.Publish);
states.Add(EnumState.Edit);
returnthis._session.CreateQuery(@"fromBoxDaop
where(p.Templatein:templatesorp.Wrapperin:templatesorp.DataSourcein:datasources)andp.Statein:states")
.SetParameterList("templates",templates)
.SetParameterList("datasources",datasources)
.SetParameterList("states",states)
.List<BoxDao>();
}
本文共计360个文字,预计阅读时间需要2分钟。
public IList QueryRelated(TemplateDao[] templates, DataSourceDao[] datasources){ ICriteria criteria=this._session.CreateCriteria(typeof(BoxDao)); ICriterion exp=null; exp=Expression.Or(Expression.In(Template, templates), Expression.In(DataSource, datasources)); criteria.Add(exp); return criteria.List();}
{
ICriteriacriteria=this._session.CreateCriteria(typeof(BoxDao));
Expression.ICriterionexp=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);
returncriteria.List<BoxDao>();
}
如果参数templates、datasources都不为null,执行的SQL如下
SELECT...
FROMCMS_BOXthis_
WHERE((this_.TEMP_IDin(?p0)orthis_.WRAPPER_IDin(?p1))orthis_.DS_IDin(?p2))andthis_.BOX_STATEin(?p3,?p4)
假如templates为null,执行的SQL如下
SELECT...
FROMCMS_BOXthis_
WHERE((1=0or1=0)orthis_.DS_IDin(?p0))andthis_.BOX_STATEin(?p1,?p2,?p3)
对这种组合的And、Or条件,一开始担心null值会引起NHibernate的异常,所以自己判断参数是否为null来确定怎样使用And、Or,写出来的代码很复杂,测试一下发现NHibernate能够处理数组为null的异常情况,因此代码简单多了。
可以看到,当数组为null时,NHibernate使用一个1=0的表达式,这正是我要的效果,因此可以省略null判断,否则还是需要自己处理的。
可以使用HQL,不过HQL不支持null参数,参数的个数为0也不行。
publicIList<BoxDao>QueryRelated(IList<TemplateDao>templates,IList<DataSourceDao>datasources)
{
IList<EnumState>states=newList<EnumState>(2);
states.Add(EnumState.Publish);
states.Add(EnumState.Edit);
returnthis._session.CreateQuery(@"fromBoxDaop
where(p.Templatein:templatesorp.Wrapperin:templatesorp.DataSourcein:datasources)andp.Statein:states")
.SetParameterList("templates",templates)
.SetParameterList("datasources",datasources)
.SetParameterList("states",states)
.List<BoxDao>();
}

