【问题标题】:NHibernate query cache not working when using join使用连接时 NHibernate 查询缓存不起作用
【发布时间】:2013-06-12 15:47:58
【问题描述】:

当它被调用两次时,第二次调用不会在数据库上重新运行查询,查询缓存会起作用。

var query = from p in session.Query<Product>() 
            where p.YearIntroduced >= 0
            select p;

query = query.Cacheable();    

var t = query.ToList();

但是,当我在查询上添加一些连接时,查询缓存不再起作用,因此当它被调用两次时,查询也会在数据库上被调用两次:

var query = from p in session.Query<Product>()

            join l in session.Query<ProductLanguage>() 
            on p.ProductId equals l.ProductId  

            where p.YearIntroduced >= 0
            select new { p, l };

query = query.Cacheable();

var t = query.ToList();

可能是个愚蠢的问题,查询缓存是否只能在一个表上工作,因此在添加连接时,查询不再可缓存?

有什么解决方案可以使查询即使有连接也可缓存?


另一个奇怪的是,如果我删除 where 子句,使用 join 的查询缓存将起作用。当它被调用两次时,第二次调用不会在数据库上重新运行查询,查询缓存工作

var query = from p in session.Query<Product>()

            join l in session.Query<ProductLanguage>() 
            on p.ProductId equals l.ProductId  

            select new { p, l };

query = query.Cacheable();

var t = query.ToList();

但是当你不能在其上放置 where 子句时,查询有什么用呢?

这是一个 NHibernate 错误,还是我只是以错误的方式使用查询缓存?

【问题讨论】:

    标签: nhibernate caching


    【解决方案1】:

    找到解决方案,将 Where 子句放在查询的最后部分:

    var query = from p in session.Query<Product>()
    
                join l in session.Query<ProductLanguage>() 
                on p.ProductId equals l.ProductId  
    
                select new { p, l };
    
    query = query.Where(x => x.p.ProductId && x.l.LanguageCode == "en").Cacheable();
    
    var t = query.ToList();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-23
      相关资源
      最近更新 更多