天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

NHibernate3.0剖析:Query篇之NHibernate.Linq標(biāo)準(zhǔn)查詢

  系列引入

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

  NHibernate.Linq概述

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

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

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

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

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

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

  下面列舉所有Linq運(yùn)算符和說明,并列舉了一些簡(jiǎn)單的NHibernate.Linq查詢,我僅僅對(duì)單一對(duì)象User對(duì)象操作:

//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; }
}

  標(biāo)準(zhǔn)查詢運(yùn)算符

  1.基本形式

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

//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.限制運(yùn)算符

  • Where:篩選序列中的項(xiàng)目

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

//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.投影運(yùn)算符

  • Select:創(chuàng)建部分序列的投影
  • SelectMany:創(chuàng)建部分序列的一對(duì)多投影

  說明:Select運(yùn)算符對(duì)于大多數(shù)操作都支持,也支持子查詢,但是不支持嵌套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.分區(qū)運(yùn)算符

  • Skip:返回跳過指定數(shù)目項(xiàng)目的序列
  • SkipWhile:返回跳過不滿足表達(dá)式項(xiàng)目的序列
  • Take:返回具有指定數(shù)目項(xiàng)目的序列
  • TakeWhile:返回具有滿足表達(dá)式項(xiàng)目的序列

  說明:不支持SkipWhile和TakeWhile。不支持連寫多個(gè)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.排序運(yùn)算符

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

  說明:排序運(yùn)算符不支持子查詢。

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

var orderingquery2 = session.Query<User>()
.OrderByDescending(o => o.Id).OrderBy(o=>o.Name).ToList();

  6.分組運(yùn)算符

  • GroupBy:按指定分組方法對(duì)序列中的項(xiàng)目進(jìn)行分組

  例如下面查詢:

//Code Snippets Copyright http://lyj.cnblogs.com/
var groupquery = (from user in session.Query<User>()
group user by user.Name
into g
select 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.設(shè)置運(yùn)算符

  • Distinct:返回?zé)o重復(fù)項(xiàng)目的序列
  • Except:返回代表兩個(gè)序列差集的序列(用于操作集合)
  • Intersect:返回代表兩個(gè)序列交集的序列(用于操作集合)
  • Union:返回代表兩個(gè)序列交集的序列(用于操作集合)

  目前支持Distinct:

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

  8.轉(zhuǎn)換運(yùn)算符(用于操作集合)

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

  NHibernate.Linq不需要支持。

  9.元素運(yùn)算符

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

  例如下面例子:

//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.生成運(yùn)算符(用于操作集合)

  • Empty:生成一個(gè)空序列
  • Range:生成一個(gè)指定范圍的序列
  • Repeat:通過將某個(gè)項(xiàng)目重復(fù)指定次數(shù)來生成一個(gè)序列

  NHibernate.Linq不需要支持。

  11.限定符

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

  僅寫下Any示例:

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

  12.聚合運(yùn)算符

  • Aggregate:對(duì)序列執(zhí)行一個(gè)自定義方法
  • Average:計(jì)算數(shù)值序列的平均值
  • Count:返回序列中的項(xiàng)目數(shù)(整數(shù))
  • LongCount:返回序列中的項(xiàng)目數(shù)(長(zhǎng)型)
  • Min:查找數(shù)字序列中的最小數(shù)
  • Max:查找數(shù)字序列中的最大數(shù)
  • Sum:匯總序列中的數(shù)字

  一些簡(jiǎn)單例子:

//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.連接運(yùn)算符

  • Concat:將兩個(gè)序列連成一個(gè)序列

  目前還未支持!

  14.聯(lián)接運(yùn)算符

  • GroupJoin:通過歸組將兩個(gè)序列聯(lián)接在一起
  • Join:將兩個(gè)序列從內(nèi)部聯(lián)接起來

  涉及對(duì)象關(guān)聯(lián)操作,以后單獨(dú)介紹。

  結(jié)語

  這篇利用單一對(duì)象學(xué)習(xí)下NHibernate.Linq最基本的標(biāo)準(zhǔn)查詢,沒有涉及多個(gè)對(duì)象操作,比較簡(jiǎn)單,目的讓大家先熟悉一下NHibernate.Linq查詢。接下來的繼續(xù)學(xué)習(xí)NHibernate.Linq。主要有NHibernate.Linq復(fù)雜標(biāo)準(zhǔn)查詢、NHibernate.Linq增強(qiáng)查詢、自定義NHibernate.Linq查詢及其在項(xiàng)目中的應(yīng)用

  希望本文對(duì)你有所幫助。

NET技術(shù)NHibernate3.0剖析:Query篇之NHibernate.Linq標(biāo)準(zhǔn)查詢,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 与子敌伦刺激对白亂輪亂性 | 国产97精品久久久天天A片 | 99久久免费国产精品特黄 | 果冻传媒视频在线播放 免费观看 | 暖暖日本免费播放 | 日本无码人妻丰满熟妇5G影院 | 亚洲精品国偷拍自产在线 | 国产成人免费手机在线观看视频 | 亚洲精品第二页 | 超碰免费视频公开97 | 白嫩美女直冒白浆 | 亚洲日本欧美国产在线视 | 久久久96 | 伦理片在线线看手机版 | 亚洲午夜一区二区电影院 | 十分钟免费视频大全在线 | 十九岁韩国电影在线观看 | 国产亚洲精品精品精品 | 亚洲综合久久一本伊伊区 | 在线中文字幕网站 | 色老板美国在线观看 | 日韩中文网 | 国产亚洲日韩在线播放不卡 | 国产精品久久久久久久人热 | 色综合久久天天影视网 | 欧美残忍xxxx极端 | 哒哒哒高清视频在线观看 | 女警被黑人20厘米强交 | 欧美另类jizzhd | 国产偷国产偷亚州清高APP | 免费看国产曰批40分钟 | gv肉片视频免费观看 | 亚洲精品123区在线观看 | 四虎影视国产精品亚洲精品hd | 久久久久亚洲精品影视 | 成人在线视频免费 | 2018三级网站免费观看 | 熟女人妻水多爽中文字幕 | 超碰国产亚洲人人 | 伊人久久精品AV一区二区 | 久久re视频这里精品一本到99 |