转自:http://www.cnblogs.com/lyj/archive/2010/08/10/1796239.html#eagerfetching
主要是为了转fetch,不知道是啥意思
本节内容 系列引入增强查询概述立即抓取(EagerFetching) 查询缓存(QueryCacheable) 结语延伸阅读系列引入 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().ToList();使用Fetch立即加载关联关系,例如立即加载所有Customer对象Order集合。 //Code Snippets Copyright http://lyj.cnblogs.com/ var x = session.Query().Fetch(c => c.Orders).ToList();使用Fetch对象立即加载多个关联关系,如果一个对象有多种集合,我们可以使用下面方法立即加载多个关联关系。例如Employee对象有Subordinates及Orders集合,使用下面方法立即加载出所有Employee对象的Subordinates和Orders集合。 //Code Snippets Copyright http://lyj.cnblogs.com/ var x = session.Query() .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() .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().Cacheable().ToList();下面Linq查询开启查询缓存,设置缓存区域和策略。 //Code Snippets Copyright http://lyj.cnblogs.com/ var q = session.Query() .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().Cacheable().ToList(); //Get Results from QueryCache var q2 = session.Query().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)。下篇继续。