当它被调用两次时,第二次调用不会在数据库上重新运行查询,查询缓存会起作用。
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错误,还是我只是以错误的方式使用查询缓存?
答案 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();