4

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

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

4

1 回答 1

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();
于 2013-06-15T09:43:18.417 回答