日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NHibernate之旅(4):探索查询之条件查询(Criteria Query)

發布時間:2023/12/20 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NHibernate之旅(4):探索查询之条件查询(Criteria Query) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本節內容

  • NHibernate中的查詢方法
  • 條件查詢(Criteria Query)
    • 1.創建ICriteria實例
    • 2.結果集限制
    • 3.結果集排序
    • 4.一些說明
  • 根據示例查詢(Query By Example)
  • 實例分析
  • 結語

上一節,我們介紹了NHibernate查詢語言的一種:NHibernate查詢語言(HQL,NHibernate Query Language),這一節介紹一下條件查詢(Criteria API)。

NHibernate中的查詢方法

在NHibernate中提供了三種查詢方式給我們選擇:NHibernate查詢語言(HQL,NHibernate Query Language)、條件查詢(Criteria API,Criteria Query)、(根據示例查詢(QBE,Query By Example)是條件查詢的一種特殊情況)、原生SQL(Literal SQL,T-SQL、PL/SQL)。每個人有不同的喜好和特長,可以根據自己的情況選擇使用其中的一種或幾種。這一節我們介紹條件查詢。

條件查詢(Criteria Query)

HQL極為強大,但是有些人希望能夠動態的使用一種面向對象API創建查詢,而不是在.NET代碼中嵌入字符串。在NHibernate中,提供了一種直觀的、可擴展的Criteria API。在我們鍵入查詢語句的時候,提供了編譯時的語法檢查,VS提供了強大的智能提示。如果你對HQL的語法感覺不是很舒服的話,用這種方法可能更容易。這種API也比HQL更可擴展。

典型用法:從ISession接口中創建ICriteria實例對象;在這個ICriteria實例對象上設置一個或多個表達式;要求ICriteria接口返回需要的列表,就是根據表達式從數據庫中返回對象。

注意:由于篇幅有限,我在這里僅僅貼出了數據訪問層的代碼。測試這些方法的代碼就沒有貼出來了,你可以下載本系列的源代碼仔細看看測試這些方法的代碼。這些實例我爭取寫出來可以運行起來,大家下載源碼看看效果,一些數據需要按個人數據庫里的數據情況修改。例如查詢條件和結果。這節,我們在上一節源代碼的基礎上,在數據訪問層中新建QueryCriteriaAPI.cs類用于編寫條件查詢方法,在數據訪問的測試層新建一QueryCriteriaAPIFixture.cs類用于測試。

1.創建ICriteria實例

使用ISession接口的CreateCriteria方法創建了NHibernate.ICriteria接口一個特定的持久化類的查詢實例,也可以說ISession是用來制造Criteria實例的工廠。

public IList<Customer> CreateCriteria() {ICriteria crit = _session.CreateCriteria(typeof(Customer));crit.SetMaxResults(50);IList<Customer> customers = crit.List<Customer>();return customers; }

例如上面的例子返回Customer對象集合,設置最大的集合數量為50條。

2.結果集限制

使用ICriteria接口提供的Add方法添加Restrictions類中約束表達式可以限制一些結果集的作用。

public IList<Customer> Narrowing() {IList<Customer> customers = _session.CreateCriteria(typeof(Customer)).Add(Restrictions.Like("Firstname", "YJing%")).Add(Restrictions.Between("Lastname", "A%", "Y%")).List<Customer>();return customers; }

3.結果集排序

使用ICriteria.Order對結果集排序,第二個參數true代表asc,false代表desc。例如下面例子查詢Customer對象按FirstName降序、Lastname升序。

public IList<Customer> Order() {return _session.CreateCriteria(typeof(Customer)).Add(Restrictions.Like("Firstname","Y%")).AddOrder(new NHibernate.Criterion.Order("Firstname", false)).AddOrder(new NHibernate.Criterion.Order("Lastname", true)).List<Customer>(); }

4.一些說明

條件查詢同樣支持關聯查詢、動態關聯抓取(在介紹一對多,多對多關系中闡述),投影、聚合和分組,離線(detached)查詢和子查詢是2.0版新增加的內容,以后在相關知識中介紹。也可以自行參考NHibernate參考文檔13章。

根據示例查詢(Query By Example)

根據示例查詢(QBE,Query By Example)是條件查詢的一種特殊情況,NHibernate.Criterion.Example類根據你指定的實例創造查詢條件。其典型的用法:創建一個Example實例;在Example實例上設置值;根據Example和設置NHibernate返回其對象集合。

例如下面的例子,按照指定Customer查詢數據庫里的記錄:

public IList<Customer> Query() {Customer customerSample = new Customer() { Firstname = "YJing", Lastname = "Lee" };return _session.CreateCriteria(typeof(Customer)).Add(Example.Create(customerSample)).List<Customer>(); }

你可以自行調整Example使之更實用:

public IList<Customer> UseQueryByExample_GetCustomer(Customer customerSample) {Example example = Example.Create(customerSample).IgnoreCase().EnableLike().SetEscapeCharacter('&');return _session.CreateCriteria(typeof(Customer)).Add(example).List<Customer>(); }

實例分析

實例1:利用CriteriaAPI按Firstname和Lastname查詢顧客。

public IList<Customer> GetCustomersByFirstnameAndLastname(string firstname, string lastname) {return _session.CreateCriteria(typeof(Customer)).Add(Restrictions.Eq("Firstname", firstname)).Add(Restrictions.Eq("Lastname", lastname)).List<Customer>(); }

測試:調用GetCustomersByFirstnameAndLastname方法,查詢Firstname為“YJing",Lastname為"Lee"的顧客,判斷查詢結果數量是否為1。(注:在數據庫中有符合這一個記錄)

[Test] public void GetCustomerByFirstnameAndLastnameTest() {IList<Customer> customers = _queryCriteriaAPI.GetCustomersByFirstnameAndLastname("YJing", "Lee");Assert.AreEqual(1, customers.Count); }

實例2:利用CriteriaAPI獲取顧客ID大于CustomerId的顧客。

public IList<Customer> GetCutomersWithIdGreaterThan(int customerId) {return _session.CreateCriteria(typeof(Customer)).Add(Restrictions.Gt("CustomerId", customerId)).List<Customer>(); }

結語

好了,通過2篇文章的介紹,對NHibernate中的查詢語法有了大致了解,知道了NHibernate中兩種最主要的查詢方式,還有一種原生SQL查詢,內容不多,請參考NHibernate官方文檔吧。多多練習!下節將介紹對對象的操作。

本系列鏈接:NHibernate之旅系列文章導航

NHibernate Q&A
  • 歡迎加入NHibernate中文社區,一起討論NHibernate知識!
  • 請到NHibernate中文社區下載本系列相關源碼。

下次繼續分享NHibernate!

轉載于:https://www.cnblogs.com/lyj/archive/2008/10/16/1312906.html

總結

以上是生活随笔為你收集整理的NHibernate之旅(4):探索查询之条件查询(Criteria Query)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。