zoukankan      html  css  js  c++  java
  • NHibernate3剖析: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。在查询时,使用这些方法用于马上载入出关联对象。

    Linq-EagerFetchingExtensionMethods

    实例分析

    关联关系默认是延迟载入的,比如以下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)的支持。

    Linq-CacheableExpressionNode

    • 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监视以上測试。能够看到其运行了一条语句,第二条直接使用查询缓存。

    Linq-QueryCacheableResults

    结语

    这篇在NHibernate.Linq标准查询的基础上,介绍了NHibernate特有的两个NHibernate.Linq增强查询马上抓取(EagerFetching)和查询缓存(QueryCacheable)。

    下篇继续。

  • 相关阅读:
    轮播图系列—1带进度条效果的轮播图
    Vue常用指令
    突发奇想,JavaScript模仿下载进度条效果
    一道有意思的JavaScript 题目
    css动画制作挂图效果
    《JavaScript 高级程序设计》学习总结七(1)
    《JavaScript 高级程序设计》学习总结六(4)
    《JavaScript 高级程序设计》学习总结六(3)
    《JavaScript 高级程序设计》学习总结六(2)
    字符流中第一个不重复的数
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/7221213.html
Copyright © 2011-2022 走看看