|
相關(guān)文章:NHibernate3.0剖析:Query篇之NHibernate.Linq標(biāo)準(zhǔn)查詢
系列引入
NHibernate3.0剖析系列分別從Configuration篇、Mapping篇、Query篇、Session策略篇、應(yīng)用篇等方面全面揭示NHibernate3.0新特性和應(yīng)用及其各種應(yīng)用程序的集成,基于NHibernte3.0版本。如果你還不熟悉NHibernate,可以快速閱讀NHibernate之旅系列文章導(dǎo)航系列入門(mén),如果你已經(jīng)在用NHibernate了,那么請(qǐng)跟上NHibernate3.0剖析系列吧。
- NHibernate專題:http://kb.cnblogs.com/zt/nhibernate/
- NHibernate官方站點(diǎn):http://nhforge.org/
- NHibernate參考文檔:http://nhforge.org/doc/nh/en/
- 獲取NHibernate地址:http://sourceforge.NET/projects/nhibernate/
增強(qiáng)查詢概述
NHibernate.Linq除了提供標(biāo)準(zhǔn)查詢運(yùn)算符外,NHibernate.Linq還專門(mén)提供了NHibernate特有的兩個(gè)增強(qiáng)查詢方法,分別是立即抓取(EagerFetching)和查詢緩存(QueryCacheable)。
立即抓取(EagerFetching)
如果我們不在Mapping文件中對(duì)對(duì)象關(guān)聯(lián)關(guān)系設(shè)置Lazy="false",默認(rèn)是延遲加載的,NHibernate3.0提供了四種擴(kuò)展方法。分別為Fetch及ThenFetch,F(xiàn)etchMany及ThenFetchMany。在查詢時(shí),使用這些方法用于立即加載出關(guān)聯(lián)對(duì)象。
關(guān)聯(lián)關(guān)系默認(rèn)是延遲加載的,例如下面NHibernate.Linq查詢查詢出所有Customer,其Order集合默認(rèn)是延遲加載的。
//Code Snippets Copyright http://lyj.cnblogs.com/var x = session.Query<Customer>().ToList();
使用Fetch立即加載關(guān)聯(lián)關(guān)系,例如立即加載所有Customer對(duì)象Order集合。
//Code Snippets Copyright http://lyj.cnblogs.com/var x = session.Query<Customer>().Fetch(c => c.Orders).ToList();
使用Fetch對(duì)象立即加載多個(gè)關(guān)聯(lián)關(guān)系,如果一個(gè)對(duì)象有多種集合,我們可以使用下面方法立即加載多個(gè)關(guān)聯(lián)關(guān)系。例如Employee對(duì)象有Subordinates及Orders集合,使用下面方法立即加載出所有Employee對(duì)象的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,F(xiàn)etchMany及ThenFetchMany立即加載嵌套關(guān)聯(lián),例如Customer對(duì)象有Order集合,Order集合也有多個(gè)OrderLines集合,可以使用下面方法全部立即加載出來(lái)。
//Code Snippets Copyright http://lyj.cnblogs.com/var x = session.Query<Customer>() .FetchMany(c => c.Orders) .ThenFetchMany(o => o.OrderLines).ToList();
查詢緩存(QueryCacheable)
NHibernate3.0提供了三種擴(kuò)展方法對(duì)查詢緩存(QueryCacheable)的支持。
- Cacheable用于開(kāi)啟查詢緩存。
- CacheMode用于設(shè)置緩存策略。
- CacheRegion用于設(shè)置緩存區(qū)域。
下面NHibernate.Linq查詢開(kāi)啟查詢緩存,當(dāng)執(zhí)行這句查詢時(shí),首先從QueryCache里面查詢,看看是否存在了,不存在則查詢數(shù)據(jù)庫(kù)后放入QueryCache,存在則直接從QueryCache中獲取。
//Code Snippets Copyright http://lyj.cnblogs.com/var q = session.Query<Customer>().Cacheable().ToList();
下面Linq查詢開(kāi)啟查詢緩存,設(shè)置緩存區(qū)域和策略。
//Code Snippets Copyright http://lyj.cnblogs.com/var q = session.Query<Customer>() .Cacheable().CacheRegion("Test") .CacheMode(CacheMode.Put).ToList();
實(shí)例分析
IStatistics接口提供QueryExecutionCount、QueryCachePutCount、QueryCacheHitCount三個(gè)屬性用來(lái)統(tǒng)計(jì)查詢緩存執(zhí)行數(shù)目、Put數(shù)目、擊中數(shù)目。
注意NHibernate默認(rèn)不啟用查詢緩存,我們需要額為配置:
//Code Snippets Copyright http://lyj.cnblogs.com/cfg.SetProperty(Environment.UseQueryCache, "true");
例如下面例子:執(zhí)行兩次相同的查詢,驗(yàn)證查詢執(zhí)行數(shù)目為1,Put數(shù)目為1,擊中數(shù)目為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監(jiān)視上面的測(cè)試,可以看到其執(zhí)行了一條語(yǔ)句,第二條直接使用查詢緩存。
這篇在NHibernate.Linq標(biāo)準(zhǔn)查詢的基礎(chǔ)上,介紹了NHibernate特有的兩個(gè)NHibernate.Linq增強(qiáng)查詢立即抓取(EagerFetching)和查詢緩存(QueryCacheable)。下篇繼續(xù)。
延伸閱讀
MIKE HADLOW:NHibernate Linq Eager Fetching
Ayende:Eagerly loading entity associations efficiently with NHibernate
希望本文對(duì)你有所幫助。
NET技術(shù):NHibernate3.0剖析:Query篇之NHibernate.Linq增強(qiáng)查詢,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。