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)。

    下篇继续。

  • 相关阅读:
    Android Studio 单刷《第一行代码》系列 05 —— Fragment 基础
    Android Studio 单刷《第一行代码》系列 04 —— Activity 相关
    Android Studio 单刷《第一行代码》系列 03 —— Activity 基础
    Android Studio 单刷《第一行代码》系列 02 —— 日志工具 LogCat
    Android Studio 单刷《第一行代码》系列 01 —— 第一战 HelloWorld
    IDEA 内网手动添加oracle,mysql等数据源,以及server returns invalid timezone错误配置
    eclipse maven设置
    IntelliJ IDE 常用配置
    eclipse maven 常见问题解决方案
    Maven 安装和配置
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/7221213.html
Copyright © 2011-2022 走看看