条件查询
NHibernate.ICriteria接口表示特定持久类的一个查询。ISession是 ICriteria实例的工厂。
这里以Northwind数据库为示例数据库
示例数据表:Employees
现在只用雇员表中部分字段。
持久类如下:
public class Employees
{
public virtual int EmployeeID { get; set; }
public virtual string LastName { get; set; }
public virtual string FirstName { get; set; }
public virtual DateTime BirthDate { get; set; }
public virtual string Address { get; set; }
public virtual string City { get; set; }
public virtual string PostalCode { get; set; }
}
映射文件如下:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain" namespace="Domain.Entities">
<class table="Employees">
<id column="EmployeeID">
<generator ></generator>
</id>
<property column="LastName" type="String"></property>
<property column="FirstName" type="String"></property>
<property column="BirthDate" type="DateTime"></property>
<property column="Address" type="String"></property>
<property column="City" type="String"></property>
<property column="PostalCode" type="String"></property>
</class>
</hibernate-mapping>
开始
(一) 返回所有实例(返回所有雇员)
这里返回的所有实例,且是全部的属性(字段)
ICriteria crt = _session.CreateCriteria(typeof(Employees));
return crt.List<Employees>();
Isession创建条件查询实例有4个构造方法。
(二) 返回部分实例(返回2个雇员)
ICriteria crt = _session.CreateCriteria(typeof(Employees));
crt.SetMaxResults(2);
return crt.List<Employees>();
(三)条件查询的约束条件
(1)Expression
ICriteria crt = _session.CreateCriteria(typeof(Employees));
crt.Add(Expression.Eq("City","London"));
return crt.List<Employees>();
查询内容为:雇员的城市是在伦敦的。其中Expression的名字空间为:NHibernate.Criterion
Expression类 定义了获得某些内置ICriterion类型的工厂方法,这里用到了等于
(2)Restrictions
ICriteria crt = _session.CreateCriteria(typeof(Employees));
crt.Add(Restrictions.Eq("City", "London"));
return crt.List<Employees>();
查询内容为:雇员的城市是在伦敦的。其中Restrictions的名字空间为:NHibernate.Criterion
(3)通过实例来查询
Employees ee = new Employees { City = "London", BirthDate = Convert.ToDateTime("1955-03-04 00:00:00.000") };
ICriteria crt = _session.CreateCriteria(typeof(Employees));
crt.Add(Example.Create(ee));
return crt.List<Employees>();
查询伦敦的,生日在那个时间的。(为什么这里我要加个生日上去?因为我的持久类中有这个属性,如果在实例查询中不给定这个值,会有日期越界的异常。在下边的例子中,来处理这种情况)这是限制的相等的实现。下边实现一个相似的例子:
Employees ee = new Employees { FirstName = "a"};
Example exp=Example.Create(ee)
.EnableLike(MatchMode.Start)
.ExcludeProperty("BirthDate")
.IgnoreCase();
ICriteria crt = _session.CreateCriteria(typeof(Employees));
crt.Add(exp);
return crt.List<Employees>();
这个例子中,指定相似的姓名等a,看实例exp:
·采用相似比较EnableLike
·相似比较匹配模式MatchMode.Start,开头匹配,这个应该类似于SQL中的a%
·排除比较属性ExcludeProperty,这个方法就是用于处理排除的。上个例子中日期没给,所以会出现异常,而这个方法则排除了这种异常发生(其实就是排除不比较的属性(字段))。
·忽略大小写
(四)排序
ICriteria crt = _session.CreateCriteria(typeof(Employees));
crt.AddOrder(new NHibernate.Criterion.Order("FirstName", true));
return crt.List<Employees>();
排序字段:名字,升序(true)
(五)聚合
(1)查询人数
ICriteria crt = _session.CreateCriteria(typeof(Employees));
crt.SetProjection(Projections.RowCount());
return crt.List();
NHibernate.Expression.Projections是 IProjection 的实例工厂。通过调用 SetProjection()应用投影到一个查询。
(2)Avg
从这个开始到以下的例子又回到以Products为示例数据表
ICriteria crt = _session.CreateCriteria(typeof(Products));
crt.SetProjection(Projections.ProjectionList()
.Add(Projections.Avg("Price"))
);
return crt.List();
通过投影列表来添加投影聚合方法。
这里取得产品的平均价格,这里没有条件约束,下边这个例子取得产品类别为2的产品的平均价格:
ICriteria crt = _session.CreateCriteria(typeof(Products));
crt.SetProjection(Projections.ProjectionList()
.Add(Projections.Avg("Price")))
.Add(Expression.Eq("CategoryID",2));
return crt.List();
(3)Max(最大价格)
ICriteria crt = _session.CreateCriteria(typeof(Products));
crt.SetProjection(Projections.ProjectionList()
.Add(Projections.Max("Price")));
return crt.List();
(4)Min(最低价格)
ICriteria crt = _session.CreateCriteria(typeof(Products));
crt.SetProjection(Projections.ProjectionList()
.Add(Projections.Min ("Price")));
return crt.List();
(5)Sum(和)
ICriteria crt = _session.CreateCriteria(typeof(Products));
crt.SetProjection(Projections.ProjectionList()
.Add(Projections.Sum ("Price")));
return crt.List();
(6)分组
ICriteria crt = _session.CreateCriteria(typeof(Products));
crt.SetProjection(Projections.ProjectionList()
.Add(Projections.GroupProperty("CategoryID")));
return crt.List<int>();
这个分组只是返回一个属性,所以用int泛型可以了。下边的例子返回分组,并返回各组的数目
ICriteria crt = _session.CreateCriteria(typeof(Products));
crt.SetProjection(Projections.ProjectionList()
.Add(Projections.GroupProperty("CategoryID"))
.Add(Projections.RowCount()));
return crt.List();
·这里的List为System.Collections.Ilist,且是object[]类型的