2013-06-12 36 views
3

当这被调用两次时,第二次调用不会重新运行数据库上的查询,查询缓存将起作用。NHibernate查询缓存在使用连接时不起作用

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子句。当这个被调用两次,第二次调用不重新运行数据库的查询,查询缓存的工作

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

找到了解决办法,把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();