一起谈.NET技术,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.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-08-31 20:01:59

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

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

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

一起谈.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剖析:Query篇之NHibernate.Linq自定义扩展

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

一起谈.NET技术,使用Brahma在GPU上执行LINQ

Brahma是一个用于并行计算的开源库,它由C#编写并支持在多种处理器上运行.目前,Brahma仅包含一个图形处理器(GPU)模块,但是它的模块化结构可以支持更多种类的处理器.使用Brahma,同一个C#方法中的语句可以同时运行在CPU和GPU上,而不需要额外的代码. Brahma通过将LINQ语句转换成目标处理器代码来执行并行计算,所生成的代码会跟据目标处理器的不同而不同.例如针对DirectX会生成High Level Shading Language,而针对OpenGL则会生成OpenGL

一起谈.NET技术,NHibernate 3.0.0.Alpha1 发布及新特性介绍

发布 刚刚NHibernate的Leader--Fabio Maulo发布了NHibernate 3.0.0.Alpha1版本,这是NHibernate 3.0.0的第一个公开测试版本. 下载地址 你可以到这里下载NHibernate 3.0.0.Alpha1,基于.Net3.5平台,具体文件如下. NHibernate源码:NHibernate-3.0.0.Alpha1-src.zip NHibernate二进制文件:NHibernate-3.0.0.Alpha1-bin.zip 特性介绍 N

一起谈.NET技术,VS 2010 和 .NET 4.0 系列之《自动启动ASP.NET应用》篇

本系列文章导航 VS 2010 和 .NET 4.0 系列之<ASP.NET 4 中的SEO改进 >篇 VS 2010 和 .NET 4.0 系列之<干净的Web.Config文件 >篇 VS 2010 和 .NET 4.0 系列之<起始项目模板>篇 VS 2010 和 .NET 4.0 系列之<多定向支持>篇 VS 2010 和 .NET 4.0 系列之<多显示器支持>篇 VS 2010 和 .NET 4.0 系列之<代码优化的Web开发

一起谈.NET技术,VS 2010 和 .NET 4.0 系列之《代码优化的Web开发Profile》篇

本系列文章导航 VS 2010 和 .NET 4.0 系列之<ASP.NET 4 中的SEO改进 >篇 VS 2010 和 .NET 4.0 系列之<干净的Web.Config文件 >篇 VS 2010 和 .NET 4.0 系列之<起始项目模板>篇 VS 2010 和 .NET 4.0 系列之<多定向支持>篇 VS 2010 和 .NET 4.0 系列之<多显示器支持>篇 VS 2010 和 .NET 4.0 系列之<代码优化的Web开发