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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

NHibernate3剖析:Query篇之NHibernate.Linq标准查询

發布時間:2025/3/21 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NHibernate3剖析:Query篇之NHibernate.Linq标准查询 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本節內容

  • 系列引入
  • NHibernate.Linq概述
  • 標準查詢運算符
  • 結語

系列引入

NHibernate3.0剖析系列分別從Configuration篇、Mapping篇、Query篇、Session策略篇、應用篇等方面全面揭示NHibernate3.0新特性和應用及其各種應用程序的集成,基于NHibernte3.0版本。如果你還不熟悉NHibernate,可以快速閱讀NHibernate之旅系列文章導航系列入門,如果你已經在用NHibernate了,那么請跟上NHibernate3.0剖析系列吧。

  • NHibernate專題:http://kb.cnblogs.com/zt/nhibernate/
  • NHibernate官方站點:http://nhforge.org/
  • NHibernate參考文檔:http://nhforge.org/doc/nh/en/
  • 獲取NHibernate地址:http://sourceforge.net/projects/nhibernate/

NHibernate.Linq概述

NHibernate.Linq基于HQL AST分析器的Linq Provider,由Steve Strong貢獻者開發的,底層使用第三方Re-Linq開源框架。所以NHibernate3.0多了一個必需程序集:Remotion.Data.Linq.dll。

注意:在之前NHibernate版本中并不存在Linq功能,Ayende Rahien貢獻者為NHibernate2.1.0GA和NHibernate2.1.2GA版本設計第三方NHiberante.Linq.dll(對應為NHibernate.Linq-1.0.0.GA-bin.zip和NHibernate.Linq-2.1.2-GA-Bin.zip)(目前已經停止了維護),它是基于Criteria API的Linq Provider,主要功能是將簡單的Linq表達式轉化為Criteria API,由于Criteria API的功能有限,所以存在很多天生的不足(聯接和子查詢不支持)。如果使用NHibernate2.1.0GA或者NHibernate2.1.2GA版本可以下載使用NHiberante.Linq.dll,在這里不作介紹。

下面看看NHibernate提供的全新的NHibernate.Linq查詢。

我們使用ISession接口的Query<T>()擴展方法創建一個NHibernate.Linq查詢。

首先需要using NHibernate.Linq命名空間,然后使用ISession.Query<T>()獲得IQueryable<T>,我們對其做一些延遲操作(例如where、orderby等),最后使用不延遲的操作(例如ToList()、Count()、FirstOrDefault())返回需要的結果。

注意,NHibernate.Linq查詢將Linq運算符轉換為HQL,有些Linq運算符本身是專門處理集合的,而SQL主要是在處理無序值集。所以NHibernate.Linq查詢肯定不需要支持這些專門處理集合的運算符,例如Except、Intersect、轉換運算符、生成運算符等。

下面列舉所有Linq運算符和說明,并列舉了一些簡單的NHibernate.Linq查詢,我僅僅對單一對象User對象操作:

//Code Snippets Copyright http://lyj.cnblogs.com/ public class User {public Guid Id { get; set; }public string Name { get; set; }public int Age { get; set; } }

標準查詢運算符

1.基本形式

使用ISession的Query<User>(),然后ToList()查詢出所有的User對象。

//Code Snippets Copyright http://lyj.cnblogs.com/ var basicquery = (from user in session.Query<User>()select user).ToList();var basicquery2 = session.Query<User>().ToList();

2.限制運算符

  • Where:篩選序列中的項目

說明:對屬性值一些篩選,篩選屬性支持組件、枚舉、各種關聯、支持基本類型的方法。例如Int等類型的等于、大于、小于,不等于;String類型的StartsWith、EndsWith、Contains、Equals、ToLower、ToLowerInvariant、ToUpper、ToUpperInvariant、Substring、IndexOf等;DateTime的Year、Date、Month等。也可以在Where運算符中使用聚合操作符的子查詢。

//Code Snippets Copyright http://lyj.cnblogs.com/ var restrictionquery = (from user in session.Query<User>()where user.Name == "李永京"select user).ToList();var restrictionquery2 = session.Query<User>().Where(o => o.Name == "李永京").ToList();

3.投影運算符

  • Select:創建部分序列的投影
  • SelectMany:創建部分序列的一對多投影

說明:Select運算符對于大多數操作都支持,也支持子查詢,但是不支持嵌套Select。SelectMany不支持。

//Code Snippets Copyright http://lyj.cnblogs.com/ var selectAnonymousquery = (from user in session.Query<User>()select new {user.Name, Age = user.Age}).ToList();var selectAnonymousquery2 = session.Query<User>().Select(o => new {o.Name, Age = o.Age}).ToList();

4.分區運算符

  • Skip:返回跳過指定數目項目的序列
  • SkipWhile:返回跳過不滿足表達式項目的序列
  • Take:返回具有指定數目項目的序列
  • TakeWhile:返回具有滿足表達式項目的序列

說明:不支持SkipWhile和TakeWhile。不支持連寫多個Take或者Skip。

//Code Snippets Copyright http://lyj.cnblogs.com/ var partitioningquery = (from user in session.Query<User>()select user).Take(2).Skip(2).ToList();var partitioningquery2 = session.Query<User>().Take(2).Skip(2).ToList();

5.排序運算符

  • OrderBy:以升序按值排列序列
  • OrderByDescending:以降序按值排列序列
  • ThenBy:升序排列已排序的序列
  • ThenByDescending:降序排列已排序的序列
  • Reverse:顛倒序列中項目的順序(用于操作集合)

說明:排序運算符不支持子查詢。

//Code Snippets Copyright http://lyj.cnblogs.com/ var orderingquery = (from user in session.Query<User>()orderby user.Id descending, user.Name ascendingselect user).ToList();var orderingquery2 = session.Query<User>().OrderByDescending(o => o.Id).OrderBy(o=>o.Name).ToList();

6.分組運算符

  • GroupBy:按指定分組方法對序列中的項目進行分組

例如下面查詢:

//Code Snippets Copyright http://lyj.cnblogs.com/ var groupquery = (from user in session.Query<User>()group user by user.Nameinto gselect new{g.Key,Age = g.Sum(p => p.Age)}).ToList(); var groupquery2 = session.Query<User>().GroupBy(o => o.Name).Select(o =>new { o.Key, Age = o.Sum(p => p.Age)}).ToList();

7.設置運算符

  • Distinct:返回無重復項目的序列
  • Except:返回代表兩個序列差集的序列(用于操作集合)
  • Intersect:返回代表兩個序列交集的序列(用于操作集合)
  • Union:返回代表兩個序列交集的序列(用于操作集合)

目前支持Distinct:

//Code Snippets Copyright http://lyj.cnblogs.com/ var distinctquery = session.Query<User>().Distinct().ToList();

8.轉換運算符(用于操作集合)

  • Cast:將序列中的元素轉換成指定類型
  • OfType:篩選序列中指定類型的元素
  • ToArray:從序列返回一個數組
  • ToDictionary:從序列返回一個字典
  • ToList:從序列返回一個列表
  • ToLookup:從序列返回一個查詢
  • ToSequence:返回一個IEnumerable序列

NHibernate.Linq不需要支持。

9.元素運算符

  • DefaultIfEmpty:為空序列創建默認元素(用于操作集合)
  • ElementAt:返回序列中指定索引的元素(用于操作集合)
  • ElementAtOrDefault:返回序列中指定索引的元素,或者如果索引超出范圍,則返回默認值(用于操作集合)
  • First:返回序列中的第一個元素
  • FirstOrDefault:返回序列中的第一個元素,或者如果未找到元素,則返回默認值
  • Last:返回序列中的最后一個元素(用于操作集合)
  • LastOrDefault:返回序列中的最后一個元素,或者如果未找到元素,則返回默認值(用于操作集合)
  • Single:返回序列中的單個元素
  • SingleOrDefault:返回序列中的單個元素,或者如果未找到元素,則返回默認值

例如下面例子:

//Code Snippets Copyright http://lyj.cnblogs.com/ var firstquery = session.Query<User>().First(u => u.Name == "李永京"); var firstOrDefaultquery = session.Query<User>().FirstOrDefault(u => u.Name == "李永京");var singlequery = session.Query<User>().Single(u => u.Name == "李永京"); var singleOrDefaultquery = session.Query<User>().SingleOrDefault(u => u.Name == "李永京");

10.生成運算符(用于操作集合)

  • Empty:生成一個空序列
  • Range:生成一個指定范圍的序列
  • Repeat:通過將某個項目重復指定次數來生成一個序列

NHibernate.Linq不需要支持。

11.限定符

  • All:確定序列中的所有項目是否滿足某個條件
  • Any:確定序列中是否有任何項目滿足條件
  • Contains:確定序列是否包含指定項目

僅寫下Any示例:

//Code Snippets Copyright http://lyj.cnblogs.com/ var anyquery = session.Query<User>().Any();//就是取任意一個

12.聚合運算符

  • Aggregate:對序列執行一個自定義方法
  • Average:計算數值序列的平均值
  • Count:返回序列中的項目數(整數)
  • LongCount:返回序列中的項目數(長型)
  • Min:查找數字序列中的最小數
  • Max:查找數字序列中的最大數
  • Sum:匯總序列中的數字

一些簡單例子:

//Code Snippets Copyright http://lyj.cnblogs.com/ var aggregatequery = session.Query<User>().Where(o => o.Name.Contains("李永京")).Select(o => o.Id).Aggregate(new StringBuilder(), (sb, id) => sb.Append(id).Append(",")); var average = session.Query<User>().Average(u => u.Age); var countquery = session.Query<User>().Count(); var longCountquery = session.Query<User>().LongCount(); var minquery = session.Query<User>().Min(u => u.Age); var maxquery = session.Query<User>().Max(u => u.Age); var sumquery = session.Query<User>().Sum(u => u.Age);

13.連接運算符

  • Concat:將兩個序列連成一個序列

目前還未支持!

14.聯接運算符

  • GroupJoin:通過歸組將兩個序列聯接在一起
  • Join:將兩個序列從內部聯接起來

涉及對象關聯操作,以后單獨介紹。

結語

這篇利用單一對象學習下NHibernate.Linq最基本的標準查詢,沒有涉及多個對象操作,比較簡單,目的讓大家先熟悉一下NHibernate.Linq查詢。接下來的繼續學習NHibernate.Linq。主要有NHibernate.Linq復雜標準查詢、NHibernate.Linq增強查詢、自定義NHibernate.Linq查詢及其在項目中的應用。

希望本文對你有所幫助。

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的NHibernate3剖析:Query篇之NHibernate.Linq标准查询的全部內容,希望文章能夠幫你解決所遇到的問題。

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