快捷搜索:

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

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.zipNHibernate.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()扩展措施创建一个NHibernate.Linq查询。

首先必要using NHibernate.Linq命名空间,然后应用ISession.Query()得到IQueryable,我们对其做一些延迟操作(例如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(),然后ToList()查询出所有的User工具。

//Code Snippets Copyright http://lyj.cnblogs.com/

var basicquery = (from user in session.QueryUser>()

select user).ToList();

var basicquery2 = session.QueryUser>().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.QueryUser>()

where user.Name == "李永京"

select user).ToList();

var restrictionquery2 = session.QueryUser>().Where(o => o.Name == "李永京").ToList();

3.投影运算符

Select:创建部分序列的投影

SelectMany:创建部分序列的一对多投影

阐明:Select运算符对付大年夜多半操作都支持,也支持子查询,然则不支持嵌套Select。SelectMany不支持。

//Code Snippets Copyright http://lyj.cnblogs.com/

var selectAnonymousquery = (from user in session.QueryUser>()

select new {user.Name, Age = user.Age}).ToList();

var selectAnonymousquery2 = session.QueryUser>()

.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.QueryUser>()

select user).Take(2).Skip(2).ToList();

var partitioningquery2 = session.QueryUser>().Take(2).Skip(2).ToList();

5.排序运算符

OrderBy:以升序按值排列序列

OrderByDescending:以降序按值排列序列

ThenBy:升序排列已排序的序列

ThenByDescending:降序排列已排序的序列

Reverse:倒置序列中项目的顺序(用于操作聚拢)

阐明:排序运算符不支持子查询。

//Code Snippets Copyright http://lyj.cnblogs.com/

var orderingquery = (from user in session.QueryUser>()

orderby user.Id descending, user.Name ascending

select user).ToList();

var orderingquery2 = session.QueryUser>()

.OrderByDescending(o => o.Id).OrderBy(o=>o.Name).ToList();

6.分组运算符

GroupBy:按指定分组措施对序列中的项目进行分组

例如下面查询:

//Code Snippets Copyright http://lyj.cnblogs.com/

var groupquery = (from user in session.QueryUser>()

group user by user.Name

into g

select new

{

g.Key,

Age = g.Sum(p => p.Age)

}).ToList();

var groupquery2 = session.QueryUser>().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.QueryUser>().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.QueryUser>().First(u => u.Name == "李永京");

var firstOrDefaultquery = session.QueryUser>().FirstOrDefault(u => u.Name == "李永京");

var singlequery = session.QueryUser>().Single(u => u.Name == "李永京");

var singleOrDefaultquery = session.QueryUser>().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.QueryUser>().Any();//便是取随意率性一个

12.聚合运算符

Aggregate:对序列履行一个自定义措施

Average:谋略数值序列的匀称值

Count:返回序列中的项目数(整数)

LongCount:返回序列中的项目数(长型)

Min:查找数字序列中的最小数

Max:查找数字序列中的最大年夜数

Sum:汇总序列中的数字

一些简单例子:

//Code Snippets Copyright http://lyj.cnblogs.com/

var aggregatequery = session.QueryUser>()

.Where(o => o.Name.Contains("李永京"))

.Select(o => o.Id)

.Aggregate(new StringBuilder(), (sb, id) => sb.Append(id).Append(","));

var average = session.QueryUser>().Average(u => u.Age);

var countquery = session.QueryUser>().Count();

var longCountquery = session.QueryUser>().LongCount();

var minquery = session.QueryUser>().Min(u => u.Age);

var maxquery = session.QueryUser>().Max(u => u.Age);

var sumquery = session.QueryUser>().Sum(u => u.Age);

13.连接运算符

Concat:将两个序列连成一个序列

今朝还未支持!

14.联接运算符

GroupJoin:经由过程归组将两个序列联接在一路

Join:将两个序列从内部联接起来

涉及工具关联操作,今后零丁先容。

结语

这篇使用单一工具进修下NHibernate.Linq最基础的标准查询,没有涉及多个工具操作,对照简单,目的让大年夜家先认识一下NHibernate.Linq查询。接下来的继承进修NHibernate.Linq。主要有NHibernate.Linq繁杂标准查询、NHibernate.Linq增强查询、自定义NHibernate.Linq查询及其在项目中的利用。

盼望本文对你有所赞助。

您可能还会对下面的文章感兴趣: