NHibernate3剖析:Query篇之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还专门提供了NHibernate特有的两个增强查询方法,各自是马上抓取(EagerFetching)和查询缓存(QueryCacheable)。
马上抓取(EagerFetching)
假设我们不在Mapping文件里对对象关联关系设置Lazy="false",默认是延迟载入的。NHibernate3.0提供了四种扩展方法。分别为Fetch及ThenFetch,FetchMany及ThenFetchMany。在查询时。使用这些方法用于马上载入出关联对象。

实例分析
关联关系默认是延迟载入的。比如以下NHibernate.Linq查询查询出全部Customer。其Order集合默认是延迟载入的。
//Code Snippets Copyright http://lyj.cnblogs.com/
var x = session.Query<Customer>().ToList();
使用Fetch马上载入关联关系。比如马上载入全部Customer对象Order集合。
//Code Snippets Copyright http://lyj.cnblogs.com/
var x = session.Query<Customer>().Fetch(c => c.Orders).ToList();
使用Fetch对象马上载入多个关联关系。假设一个对象有多种集合,我们能够使用以下方法马上载入多个关联关系。比如Employee对象有Subordinates及Orders集合。使用以下方法马上载入出全部Employee对象的Subordinates和Orders集合。
//Code Snippets Copyright http://lyj.cnblogs.com/
var x = session.Query<Employee>()
.Fetch(e => e.Subordinates)
.Fetch(e => e.Orders).ToList();
使用Fetch及ThenFetch,FetchMany及ThenFetchMany马上载入嵌套关联,比如Customer对象有Order集合,Order集合也有多个OrderLines集合。能够使用以下方法所有马上载入出来。
//Code Snippets Copyright http://lyj.cnblogs.com/
var x = session.Query<Customer>()
.FetchMany(c => c.Orders)
.ThenFetchMany(o => o.OrderLines).ToList();
查询缓存(QueryCacheable)
NHibernate3.0提供了三种扩展方法对查询缓存(QueryCacheable)的支持。

- Cacheable用于开启查询缓存。
- CacheMode用于设置缓存策略。
- CacheRegion用于设置缓存区域。
以下NHibernate.Linq查询开启查询缓存。当运行这句查询时。首先从QueryCache里面查询。看看是否存在了,不存在则查询数据库后放入QueryCache,存在则直接从QueryCache中获取。
//Code Snippets Copyright http://lyj.cnblogs.com/
var q = session.Query<Customer>().Cacheable().ToList();
以下Linq查询开启查询缓存。设置缓存区域和策略。
//Code Snippets Copyright http://lyj.cnblogs.com/
var q = session.Query<Customer>()
.Cacheable().CacheRegion("Test")
.CacheMode(CacheMode.Put).ToList();
实例分析
IStatistics接口提供QueryExecutionCount、QueryCachePutCount、QueryCacheHitCount三个属性用来统计查询缓存运行数目、Put数目、击中数目。
注意NHibernate默认不启用查询缓存,我们须要额为配置:
//Code Snippets Copyright http://lyj.cnblogs.com/
cfg.SetProperty(Environment.UseQueryCache, "true");
比如以下样例:运行两次同样的查询,验证查询运行数目为1,Put数目为1。击中数目为1。
//Code Snippets Copyright http://lyj.cnblogs.com/
[Test]
public void QueryCacheable()
{
SessionFactory.Statistics.Clear();
SessionFactoryImplementor.QueryCache.Clear();
var session = SessionFactory.OpenSession();
//Execution and Put Query
var q = session.Query<Customer>().Cacheable().ToList();
//Get Results from QueryCache
var q2 = session.Query<Customer>().Cacheable().ToList();
SessionFactory.Statistics.QueryExecutionCount.Should().Be.EqualTo(1);
SessionFactory.Statistics.QueryCachePutCount.Should().Be.EqualTo(1);
SessionFactory.Statistics.QueryCacheHitCount.Should().Be.EqualTo(1);
}
假设使用NHibernate Profiler监视上面的測试,能够看到其运行了一条语句,第二条直接使用查询缓存。

结语
这篇在NHibernate.Linq标准查询的基础上,介绍了NHibernate特有的两个NHibernate.Linq增强查询马上抓取(EagerFetching)和查询缓存(QueryCacheable)。
下篇继续。
NHibernate3剖析:Query篇之NHibernate.Linq增强查询的更多相关文章
- NHibernate Linq查询 扩展增强 (第九篇)
在上一篇的Linq to NHibernate的介绍当中,全部是namespace NHibernate命名空间中的IQueryOver<TRoot, TSubType>接口提供的.IQu ...
- NHibernate3剖析:Mapping篇之集合映射基础(3):List映射
系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种 ...
- NHibernate3剖析:Mapping篇之集合映射基础(2):Bag映射
系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种 ...
- 手撸ORM浅谈ORM框架之Query篇
快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...
- linux0.11内核源码剖析:第一篇 内存管理、memory.c【转】
转自:http://www.cnblogs.com/v-July-v/archive/2011/01/06/1983695.html linux0.11内核源码剖析第一篇:memory.c July ...
- 菜鸟nginx源代码剖析 框架篇(一) 从main函数看nginx启动流程
菜鸟nginx源代码剖析 框架篇(一) 从main函数看nginx启动流程 Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.c ...
- C#3.0新增功能09 LINQ 标准查询运算符 04 运算
连载目录 [已更新最新开发文章,点击查看详细] 本篇主要介绍标准查询运算符的常用运算功能. 01 对数据排序 排序操作基于一个或多个属性对序列的元素进行排序. 第一个排序条件对元素执行主要排序. ...
- [C#] 进阶 - LINQ 标准查询操作概述
LINQ 标准查询操作概述 序 “标准查询运算符”是组成语言集成查询 (LINQ) 模式的方法.大多数这些方法都在序列上运行,其中的序列是一个对象,其类型实现了IEnumerable<T> ...
- Linq 动态查询排序
Linq的排序一般是这样写的: query.OrderBy(x => x.Tel).Skip().Take(); 实际使用中排序字段可能是通过字符类型的参数来设置的,于是想这样实现: query ...
随机推荐
- Linux 网卡驱动学习(六)(应用层、tcp 层、ip 层、设备层和驱动层作用解析)
本文将介绍网络连接建立的过程.收发包流程,以及当中应用层.tcp层.ip层.设备层和驱动层各层发挥的作用. 1.应用层 对于使用socket进行网络连接的server端程序.我们会先调用socket函 ...
- java 递归实现删除或查询指定目录下的全部文件
/** * 递归列举盘符下的全部文件的名称,如E:\HeartIsland * * @author HeartIsland * */ public class FileListDemo { /** * ...
- VC 对话框程序加入工具栏button图标及其buttontooltip
注意:本人使用VC++2010开发环境进行測试. 在使用VC开发对话框程序时不像开发单文档程序和多文档程序那么方便,非常多资源都须要自己手动加入.近期在开发一个程序时.想尝试在对话框程序里面加入 工具 ...
- QFileSystemModel只显示名称,不显示size,type,modified
Qt 提供的 QFileSystemModel可以提供文件目录树预览功能,但是预览的都自带了Name,size,type, modified等信息.我现在只想显示name这一列,不想显示size,ty ...
- 2017-3-4 leetcode 414 485 495
虽说周末要早起来着,但是日子过得有点奇怪,一不小心就忘掉了... leetcode414 https://leetcode.com/problems/third-maximum-number/?tab ...
- 2019黑马JAVAEE57期基础班就业班(全套)
黑马java57期 百度网盘 2019黑马JAVAEE57期基础班就业班(全套)百度网盘 下载 Spring全家桶解决方案 - 微服务认证解决方案(JWT) - 微服务网关解决方案(Zuul) 黑马j ...
- Docker运行程序报错 WARNING: IPv4 forwarding is disabled. Networking will not work
WARNING: IPv4 forwarding is disabled. Networking will not work. 第一步:vi /usr/lib/sysctl.d/00-system ...
- Vue中问题总结 与未解决问题总结
问题一: Error in render: "TypeError: Cannot read property 'matched' of undefined" 使用路由之后报错,路由 ...
- Python爬虫:爬取糗事百科
网上看到的教程,但是是用正则表达式写的,并不能运行,后面我就用xpath改了,然后重新写了逻辑,并且使用了双线程,也算是原创了吧#!/usr/bin/python# -*- encoding:utf- ...
- 「JavaSE 重新出发」05.01.01 equals 方法
equals 方法示例 // 代码来自<Java核心技术 卷I>P167 // 父类 public class Employee{ ... public boolean equals(Ob ...