系列引入

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. 程序猿的量化交易之路(18)--Cointrader之Event实体(6)

    转载需注明: 事件,是Esper的重要概念. 这里我们定义个事件类.它是Temporal实体的派生类. 不过对Temporal简单的包装.其代码例如以下: package org.cryptocoin ...

  2. Windows 8.1内置微软五笔输入法

    微软五笔输入法採用86版编码,不是Windows 8.1系统的中文语言的缺省输入法,你在使用它之前须要把它加入到系统输入法中. 在控制面板双击"",然后加入微软五笔输入法. wat ...

  3. ADT、C和Java

    <编程导论(Java)·5 链表.数组和栈> 数据抽象使得用户程序猿在编写客户程序时,摆脱该数据类型的实现细节而只关心该数据类型的接口.在计算机科学中.有一些重要的数据抽象--数据结构,应 ...

  4. 英语发音规则---D字母

    英语发音规则---D字母 一.总结 一句话总结: 1.D发[d]音? doctor ['dɒktə] n. 医生:博士 bread [bred] n. 面包:生计 hand [hænd] n. 手,手 ...

  5. Migrations有两个文件迁移数据的方法

    不分开迁移报错如下; 解决方案 1 迁移Migration/nfoManage EntityFramework\Enable-Migrations -ContextTypeName InfoModel ...

  6. android 方案源码下载repo同步遇到的问题

    1. error: could not verify the tag 'v1.12.4'的解决 repo init -u git://github.com/CyanogenMod/android.gi ...

  7. usaco No Change, 2013 Nov 不找零(二分查找+状压dp)

    Description 约翰带着 N 头奶牛在超市买东西,现在他们正在排队付钱,排在第 i 个位置的奶牛需要支付 Ci 元.今天说好所有东西都是约翰请客的,但直到付账的时候,约翰才意识到自己没带钱,身 ...

  8. 利用 js 获取地址栏参数

    1.aspx页面,进行页面跳转 window.location.href = "ProviderInfo.aspx?ProviderID="+ProviderID; 2.Provi ...

  9. List of features and minimum Clang version with support

    #1: C++11 Language Feature C++11 Proposal Available in Clang? Rvalue references N2118 Clang 2.9      ...

  10. 如何使用 GNOME Shell 扩展

    如何使用 GNOME Shell 扩展 作者: Abhishek Prakash 译者: LCTT MjSeven | 2018-03-15 10:53   评论: 1 简介:这是一份详细指南,我将会 ...