NHibernate3.0剖析系列分别从Configuration篇、Mapping篇、Query篇、Session策略篇、应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本号。
假设你还不熟悉NHibernate。能够高速阅读系列入门。假设你已经在用NHibernate了。那么请跟上NHibernate3.0剖析系列吧。
- NHibernate专题:
- NHibernate官方网站:
- NHibernate參考文档:
- 获取NHibernate地址:
NHibernate.Linq除了提供标准查询运算符外。NHibernate.Linq还专门提供了NHibernate特有的两个增强查询方法,各自是马上抓取(EagerFetching)和查询缓存(QueryCacheable)。
假设我们不在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();
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.Linq标准查询的基础上,介绍了NHibernate特有的两个NHibernate.Linq增强查询马上抓取(EagerFetching)和查询缓存(QueryCacheable)。
下篇继续。