本节内容

  • 系列引入
  • 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查询及其在项目中的应用。

希望本文对你有所帮助。

NHibernate3剖析:Query篇之NHibernate.Linq标准查询相关推荐

  1. 一起谈.NET技术,NHibernate3.0剖析:Query篇之NHibernate.Linq标准查询

    系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种 ...

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

    系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种 ...

  3. LINQ标准查询操作符

    本文基于.NET Framework 2.0编写 本文PDF下载 推荐大家下载本文的PDF进行阅读,可以方便的使用书签来阅读各个方法,而且代码中的关键字是高亮显示的. 转载请注明出处. 一.投影操作符 ...

  4. LINQ:进阶 - LINQ 标准查询操作概述

    "标准查询运算符"是组成语言集成查询 (LINQ) 模式的方法.大多数这些方法都在序列上运行,其中的序列是一个对象,其类型实现了IEnumerable<T> 接口或 I ...

  5. LINQ标准查询操作符详解

     一. 关于LINQ        LINQ 英文全称是"Language-Integrated Query",中文为"语言集成查询",它是微软首席架构师.De ...

  6. Linq标准查询运算及用法

    Linq中的查询运算符: Where,                                      获得只满足条件的元素 Select,SelectMany,               ...

  7. C# LINQ标准查询操作符

    首先添加数据集合 1 [Serializable] 2 public class Racer : IComparable<Racer>, IFormattable 3 { 4 public ...

  8. NHibernate Linq中Null值排序的解决方法

    在Nhibernate Linq的查询中如何实现Order by Nulls Last 和Order by Null First的功能呢? 方法如下: OrderByDescending(x => ...

  9. NHibernate初学者指南(15):使用LINQ to NHibernate提供程序查询数据

    在前面的<NHibernate初学者指南(8):增删查改>一文中简单的提到了查询一个实体的Get<T>和Load<T>方法以及查询实体列表的Query<T&g ...

最新文章

  1. iOS唯一标示符引导
  2. 素数定理π(n)~n/lnn弱化版证明
  3. 安卓首页图片轮播效果(淘宝、京东首页广告效果)
  4. python之itemgetter函数:对字典列表进行多键排序
  5. TypeScript里的工具类型Partial的用法
  6. windows环境的rabbitmq安装与启动
  7. react-native ios打包和Android打包
  8. 2021年3月国产数据库排行榜:雏凤声清阿里三连 绝代双骄华为合璧
  9. clienttop,clientleft,scrolltop,scrollleft,offsettop,offsetleft全解析
  10. python可见图算法_基于自适应显着性的图像分割(源码开放)
  11. 网站网络流量的极限,你考虑过么?
  12. 器件选型-OLED液晶显示原理和选型
  13. js几种常见的设计模式
  14. 忆贵州三年的教书编程岁月:不弛于空想,不骛于虚声
  15. 航班时间(计算时间差)
  16. 【校园卡】2020校园卡最近消息,电信联通默认都增加10G全国流量
  17. 计算机关机界面卡住,win7关机卡死在正在关机界面
  18. 天仙般的王祖贤和林青霞,她们都是用AI修复的
  19. python 之 arrow
  20. 长沙“一江两岸”新网红,看铜官古镇的“文和游”

热门文章

  1. tensorflow函数方法
  2. java finalize逃脱_关于Java中的finalize()方法
  3. python使用函数可以减少内存吗_如何将Python内存占用缩小20倍?
  4. oracle schema_Oracle数据库坏块检查与修复
  5. 面试题整理18 根据上排给出十个数,在其下排填出对应的十个数
  6. 15.基于Hadoop的数据仓库Hive第3部分(Hive编程实践)
  7. 李菲菲课程笔记:Deep Learning for Computer Vision – Introduction to Convolution Neural Networks
  8. 并发编程(四):也谈谈数据库的锁机制
  9. 深入剖析Redis RDB持久化机制
  10. mysql dba系统学习(2)了解mysql的源码目录及源文件