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 ...
随机推荐
- 应用市场快速下载以及网页端调起APP页面研究与实现
Github博文地址,此处更新可能不是非常及时. 好久没写博客了,好大一个坑. 正好,近期刚做完应用市场的快速下载功能,便拿来填了这个坑. 话说产品为了添加用户量,提升用户活跃度以及配合推广,更坑爹的 ...
- 公布项目到NPM
修己安人,内圣外王 近期,在开发Node项目过程中遇到了须要类jQuery深拷贝对象的问题.去Github找了半天,并没有符合的,于是,自己决定写一个(mixin.js),然后推送到NPM(查看Npm ...
- python spark kmeans demo
官方的demo from numpy import array from math import sqrt from pyspark import SparkContext from pyspark. ...
- 如何用写js弹出层 ----2017-03-29
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- MySQL 5.7 zip 文件安装过程
1.下载路径 https://dev.mysql.com/downloads/mysql/ 有账号登陆下载, 没有账号:no thanks;just start my download 2.解 ...
- Python使用functools模块中的partial函数生成偏函数
所谓偏函数即是规定了固定参数的函数,在函数式编程中我们经常可以用到,这里我们就来看一下Python使用functools模块中的partial函数生成偏函数的方法 python 中提供一种用于对函数固 ...
- Neo4j沙盒实验申请过程步骤(图文详解)
不多说,直接上干货! 参考博客 http://blog.csdn.net/u012318074/article/details/72793632 (对此表示感谢) 前期博客 我暂时是将Neo4j ...
- ASP.net 中 OutputCache 指令各个参数的作用
使用@ OutputCache指令 使用@ OutputCache指令,能够实现对页面输出缓存的一般性需要.@ OutputCache指令在ASP.NET页或者页中包含的用户控件的头部声明.这种方式非 ...
- 压力测试工具 Tinyget
Tinyget 压力测试工具使用方法为:命令行切换到工具所在路径下,然后输入压力命令.如:tinyget -srv:localhost -uri:/FeaturedProdu1cts.aspx -th ...
- javscript中变量的作用域和提升
示例: var a = 1; function foo() { if (!a) { var a = 10; } alert(a); }; foo(); 上面这段代码在运行时会产生 ...