CreateAlias 与 CreateCriteria的区别

NHibernate.Criterion方法解释

HQL运算符

QBC运算符

含义

=

Restrictions.eq()

等于equal

<>

Restrictions.ne()

不等于not equal

>

Restrictions.gt()

大于greater than

>=

Restrictions.ge()

大于等于greater than or equal

<

Restrictions.lt()

小于less than

<=

Restrictions.le()

小于等于less than or equal

is null

Restrictions.isnull()

等于空值

is not null

Restrictions.isNotNull()

非空值

like

Restrictions.like()

字符串模式匹配

and

Restrictions.and()

逻辑与

and

Restrictions.conjunction()

逻辑与

or

Restrictions.or()

逻辑或

or

Restrictions.disjunction()

逻辑或

not

Restrictions.not()

逻辑非

in(列表)

Restrictions.in()

等于列表中的某一个值

not in(列表)

Restrictions.not(Restrictions.in())

不等于列表中任意一个值

between x and y

Restrictions.between()

闭区间xy中的任意值

not between x and y

Restrictions.not(Restrictions..between())

小于值X或者大于值y

 

 

ICriteria criteria = this.Session.CreateCriteria()

               .CreateAlias(CpCourse._Organizations, "o")//表示CoOrganization实体和CpCourse实体做关联

               //.Add(Expression.Eq("o." + CoOrganization._Address, "456"));//可以根据别名再配置条件,该条件也可以写在

               下面任意位置

               .GetCriteriaByAlias("o")//表示跳到CoOrganization实体,如果不写表示还在CpCourse实体             

               .CreateAlias(CoOrganization._Users, "u")//表示CoUser实体和CoOrganization实体进行关联

               .Add(Expression.Eq("u." + CoUser._UserName, "zhuangyq"));

               //.Add(Expression.Eq("o." + CoOrganization._Address, "456"));//如这个位置

               IList list = criteria.List();

 

               以下结果集同上面写法

 

               ICriteria criteria = this.Session.CreateCriteria()

               .CreateCriteria(CpCourse._Organizations)//表示到达CoOrganization实体,与CpCourse实体关联

               //.Add(Expression.Eq(CoOrganization._Address, "456"))//条件必须紧跟CoOrganization实体后面

               .CreateCriteria(CoOrganization._Users)//表示到达CoUser实体,与CoOrganization实体关联

               .Add(Expression.Eq(CoUser._UserName, "zhuangyq"));"))//条件必须紧跟CoUser实体后面

                IList list = criteria.List();

 

CreateCriteria表示到达该实体,再与.CreateAlias或.CreateCriteria的后面的实体与该实体进行关联。

关于CreateCriteria实体的条件必须紧跟CreateCriteria的实体其后。

CreateAlias创建表别名的方式,只要在这个表的别名创建之后都可以再进行条件的添加(条件必须包含别名)

或者使用GetCriteriaByAlias方法达到该包含别名的实体后继续操作再进行.CreateAlias或.CreateCriteria。

 

在NHibernate里面查很常用。CreateAlias 返回值还是当前的Criteria,但是CreateCriteria返回的新的Criteria。

 

CreateAlias 与 CreateCriteria的区别_第1张图片

 

基本用法 如下。

var cri = session.CreateCrieria(typeof(User)) 
       .CreateCriteria("Roles") 
       .Add(Restrictions.Eq("RoleName","admin");


var cri = session.CreateCrieria(typeof(User)) 
       .CreateAlias("Roles","role") 
       .Add(Restrictions.Eq("role.RoleName","admin");
 
现在我除了想查role是admin的用户外,也想查出UserName名字叫做Joe的用户,那么他们就有区别
 
var cri = session.CreateCrieria(typeof(User))
       .Add(Restrictions.Eq("UserName", "Joe")
       .CreateCriteria("Roles") 
       .Add(Restrictions.Eq("RoleName","admin");

//第一种写法
var cri = session.CreateCrieria(typeof(User))
       .Add(Restrictions.Eq("UserName", "Joe") //紧贴着User
       .CreateAlias("Roles","role") 
       .Add(Restrictions.Eq("role.RoleName","admin"); 
//第二种写法。
var cri = session.CreateCrieria(typeof(User))
       .CreateAlias("Roles","role") 
       .Add(Restrictions.Eq("role.RoleName","admin");
       .Add(Restrictions.Eq("UserName", "Joe") //前后都没有关系,贴着role也可以。


根据 ayende 说,是生成的sql效率是一样的,不过原来的blog已经找不到了。

 

你可能感兴趣的:(CreateAlias 与 CreateCriteria的区别)