使用联接时NHibernate查询缓存不工作

使用联接时NHibernate查询缓存不工作,nhibernate,caching,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=来自会话中的p.query() 其中p.p>=0 选择p

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

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

query = query.Cacheable();    

var t = query.ToList();
var query=来自会话中的p.query()
其中p.p>=0
选择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();
var query=来自会话中的p.query()
在session.Query()中加入l
关于p.ProductId等于l.ProductId
其中p.p>=0
选择新的{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();
var query=来自会话中的p.query()
在session.Query()中加入l
关于p.ProductId等于l.ProductId
选择新的{p,l};
query=query.Cacheable();
var t=query.ToList();
但是,当不能在查询上放置where子句时,查询有什么用呢


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

找到了解决方案,将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();
var query=来自会话中的p.query()
在session.Query()中加入l
关于p.ProductId等于l.ProductId
选择新的{p,l};
query=query.Where(x=>x.p.ProductId&&x.l.LanguageCode==“en”).Cacheable();
var t=query.ToList();