2013-06-12 66 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();