Nhibernate开发专题博客

Nhibernate开发专题博客,为您精选Nhibernate开发教程,助您开发愉快!

公告信息
欢迎光临Nhibernate开发专题博客,祝您开发愉快!
文章档案

NHibernate3 Linq查询实例分析教程


本篇为您介绍:NHibernate3 的Query查询应用教程,并结合一个Query查询实例分析教程为您讲述详细内容:

    增强查询概述

      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特有的两个NHibernate.Linq增强查询立即抓取(EagerFetching)和查询缓存(QueryCacheable), 希望对您有所帮助!!!

    新浪微博粉丝精灵,刷粉丝、刷评论、刷转发、企业商家微博营销必备工具"

    2011/9/25 23:36:37 | Nhibernate开发教程 | |

    • 发表评论