條件查詢
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 name="Employees" table="Employees">
<id name="EmployeeID" column="EmployeeID">
<generator class="identity"></generator>
</id>
<property name="LastName" column="LastName" type="String"></property>
<property name="FirstName" column="FirstName" type="String"></property>
<property name="BirthDate" column="BirthDate" type="DateTime"></property>
<property name="Address" column="Address" type="String"></property>
<property name="City" column="City" type="String"></property>
<property name="PostalCode" 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);
(三)條件查詢的限制條件
(1)Expression
crt.Add(Expression.Eq("City","London"));
return crt.List<Employees>();
查詢内容為:雇員的城市是在倫敦的。其中Expression的名字空間為:NHibernate.Criterion
Expression類 定義了獲得某些内置ICriterion類型的工廠方法,這裡用到了等于
(2)Restrictions
crt.Add(Restrictions.Eq("City", "London"));
查詢内容為:雇員的城市是在倫敦的。其中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);
這個例子中,指定相似的姓名等a,看執行個體exp:
·采用相似比較EnableLike
·相似比較比對模式MatchMode.Start,開頭比對,這個應該類似于SQL中的a%
·排除比較屬性ExcludeProperty,這個方法就是用于處理排除的。上個例子中日期沒給,是以會出現異常,而這個方法則排除了這種異常發生(其實就是排除不比較的屬性(字段))。
·忽略大小寫
(四)排序
crt.AddOrder(new NHibernate.Criterion.Order("FirstName", true));
排序字段:名字,升序(true)
(五)聚合
(1)查詢人數
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));
.Add(Projections.Avg("Price")))
.Add(Expression.Eq("CategoryID",2));
return crt.List();
(3)Max(最大價格)
ICriteria crt = _session.CreateCriteria(typeof(Products));
.Add(Projections.Max("Price")));
(4)Min(最低價格)
.Add(Projections.Min ("Price")));
(5)Sum(和)
.Add(Projections.Sum ("Price")));
(6)分組
.Add(Projections.GroupProperty("CategoryID")));
return crt.List<int>();
這個分組隻是傳回一個屬性,是以用int泛型可以了。下邊的例子傳回分組,并傳回各組的數目
crt.SetProjection(Projections.ProjectionList()
.Add(Projections.GroupProperty("CategoryID"))
.Add(Projections.RowCount()));
·這裡的List為System.Collections.Ilist,且是object[]類型的
部落格園大道至簡
<a href="http://www.cnblogs.com/jams742003/" target="_blank">http://www.cnblogs.com/jams742003/</a>
轉載請注明:部落格園