使用join时,NHibernate查询缓存无法正常工作

时间:2013-06-12 15:47:59

标签: nhibernate caching

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

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错误,还是我只是以错误的方式使用查询缓存?

1 个答案:

答案 0 :(得分: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();