NHibernate - ICriteria 查詢
條件查詢
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[]類型的
轉自:https://www.cnblogs.com/360S/archive/2011/09/28/2193910.html
最後更新:2017-04-03 16:48:31