天天看點

NHibernate說探——Criteria條件查詢

條件查詢

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>

轉載請注明:部落格園

繼續閱讀