NHibernate3.0剖析:Query篇之NHibernate.Linq增强查询

  相关文章:NHibernate3.0剖析: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)。下篇继续。

  延伸阅读

  MIKE HADLOW:NHibernate Linq Eager Fetching

  Ayende:Eagerly loading entity associations efficiently with NHibernate

  希望本文对你有所帮助。

时间: 2024-09-15 23:22:41

NHibernate3.0剖析:Query篇之NHibernate.Linq增强查询的相关文章

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

相关文章:NHibernate3.0剖析:Query篇之NHibernate.Linq标准查询 系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本.如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHiber

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

系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本.如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧. NHibernate专题:http://kb.cnblogs.com

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

系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本.如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧. NHibernate专题:http://kb.cnblogs.com

NHibernate3.0剖析:Query篇之NHibernate.Linq自定义扩展

系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本.如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧. NHibernate专题:http://kb.cnblogs.com

一起谈.NET技术,NHibernate3.0剖析:Query篇之NHibernate.Linq自定义扩展

系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本.如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧. NHibernate专题:http://kb.cnblogs.com

使用NHibernate3.0来构建自己的ORM框架(一)

1. Library文件   需要的dll文件如下:   FluentNHibernate.dll (*)   NHibernate.ByteCode.Castle.dll (*)   NHibernate.dll (*)   Remotion.Data.Linq.dll   Antlr3.Runtime.dll   Castle.Core.dll   Iesi.Collections.dll   2. 创建Hibernate访问通用类 using System;using System.Col

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

转自:http://www.cnblogs.com/v-July-v/archive/2011/01/06/1983695.html linux0.11内核源码剖析第一篇:memory.c   July  二零一一年一月六日 ----------------------------------------- 博主声明:1.本系列非linux系统教程,仅仅是针对linux0.11内核源码,所做的剖析,注释.2.本系列参考:深入理解linux内核.linux内核完全注释,linux内核源代码情景分析

Duwamish深入剖析-配置篇

Duwamish深入剖析-配置篇 摘要: 本文详细介绍了Duwamish网上电子书店的Web.config配置文件的结构处理方式以及用途,阐述了配置文件的各功能模块中的作用. 目录: 引言 配置节处理程序声明 自定义配置节 配置节处理程序 总结 参考资料 作者 引言: 几乎在每本介绍Asp.Net编程的书里,在谈到如何管理数据库连接字符串的时候,都是采用将数据库连接字符串以如下形式放在Web.Config文件中: ppSettings> dd key="ConnectionString&q

Java认证宝典v1.0之SCJD篇

Java认证宝典v1.0之SCJD篇Java认证宝典v1.0之SCJD篇(本文为www.java365.com原创,版权所有,转载请注明出处) 在J2EE尚未得到规模应用以前,SCJD是java认证中的高级认证.即便现在有了SCWCD.SCJA等认证,SCJD依然有其独特的魅力. 一.考试目标 Programming Assignment Objectives Write an application program using Java technology. The application