系列引入

NHibernate3.0剖析系列分别从Configuration篇、Mapping篇、Query篇、Session策略篇、应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本号。

假设你还不熟悉NHibernate。能够高速阅读NHibernate之旅系列文章导航系列入门。假设你已经在用NHibernate了。那么请跟上NHibernate3.0剖析系列吧。

增强查询概述

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增强查询的更多相关文章

  1. NHibernate Linq查询 扩展增强 (第九篇)

    在上一篇的Linq to NHibernate的介绍当中,全部是namespace NHibernate命名空间中的IQueryOver<TRoot, TSubType>接口提供的.IQu ...

  2. NHibernate3剖析:Mapping篇之集合映射基础(3):List映射

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

  3. NHibernate3剖析:Mapping篇之集合映射基础(2):Bag映射

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

  4. 手撸ORM浅谈ORM框架之Query篇

    快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...

  5. linux0.11内核源码剖析:第一篇 内存管理、memory.c【转】

    转自:http://www.cnblogs.com/v-July-v/archive/2011/01/06/1983695.html linux0.11内核源码剖析第一篇:memory.c July  ...

  6. 菜鸟nginx源代码剖析 框架篇(一) 从main函数看nginx启动流程

    菜鸟nginx源代码剖析 框架篇(一) 从main函数看nginx启动流程 Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.c ...

  7. C#3.0新增功能09 LINQ 标准查询运算符 04 运算

    连载目录    [已更新最新开发文章,点击查看详细] 本篇主要介绍标准查询运算符的常用运算功能. 01 对数据排序 排序操作基于一个或多个属性对序列的元素进行排序. 第一个排序条件对元素执行主要排序. ...

  8. [C#] 进阶 - LINQ 标准查询操作概述

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

  9. Linq 动态查询排序

    Linq的排序一般是这样写的: query.OrderBy(x => x.Tel).Skip().Take(); 实际使用中排序字段可能是通过字符类型的参数来设置的,于是想这样实现: query ...

随机推荐

  1. 应用市场快速下载以及网页端调起APP页面研究与实现

    Github博文地址,此处更新可能不是非常及时. 好久没写博客了,好大一个坑. 正好,近期刚做完应用市场的快速下载功能,便拿来填了这个坑. 话说产品为了添加用户量,提升用户活跃度以及配合推广,更坑爹的 ...

  2. 公布项目到NPM

    修己安人,内圣外王 近期,在开发Node项目过程中遇到了须要类jQuery深拷贝对象的问题.去Github找了半天,并没有符合的,于是,自己决定写一个(mixin.js),然后推送到NPM(查看Npm ...

  3. python spark kmeans demo

    官方的demo from numpy import array from math import sqrt from pyspark import SparkContext from pyspark. ...

  4. 如何用写js弹出层 ----2017-03-29

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  5. MySQL 5.7 zip 文件安装过程

    1.下载路径 https://dev.mysql.com/downloads/mysql/   有账号登陆下载, 没有账号:no thanks;just start my download   2.解 ...

  6. Python使用functools模块中的partial函数生成偏函数

    所谓偏函数即是规定了固定参数的函数,在函数式编程中我们经常可以用到,这里我们就来看一下Python使用functools模块中的partial函数生成偏函数的方法 python 中提供一种用于对函数固 ...

  7. Neo4j沙盒实验申请过程步骤(图文详解)

    不多说,直接上干货! 参考博客 http://blog.csdn.net/u012318074/article/details/72793632    (对此表示感谢) 前期博客 我暂时是将Neo4j ...

  8. ASP.net 中 OutputCache 指令各个参数的作用

    使用@ OutputCache指令 使用@ OutputCache指令,能够实现对页面输出缓存的一般性需要.@ OutputCache指令在ASP.NET页或者页中包含的用户控件的头部声明.这种方式非 ...

  9. 压力测试工具 Tinyget

    Tinyget 压力测试工具使用方法为:命令行切换到工具所在路径下,然后输入压力命令.如:tinyget -srv:localhost -uri:/FeaturedProdu1cts.aspx -th ...

  10. javscript中变量的作用域和提升

    示例: var a = 1; function foo() {   if (!a) {     var a = 10;   }    alert(a); }; foo(); 上面这段代码在运行时会产生 ...