2011-02-07 33 views

回答

5

它们将它用于返回实体,但除非使用第二级缓存,否则查询将直接转到db。

考虑一下:

var fooUsingGet = session.Get<Foo>(fooId); 
var fooQueryById = session.Query<Foo>().Single(f => f.Id == fooId); 

两个查询执行(一个用于获取,一个用于查询),但是这两个变量包含相同的对象引用。现在

,如果您启用二级缓存,查询缓存,并为查询指定缓存:

var fooQueryById = session.Query<Foo>().Cacheable() 
          .Single(f => f.Id == fooId); 
var fooQueryByIdAgain = session.Query<Foo>().Cacheable() 
           .Single(f => f.Id == fooId); 

只有一个查询将被执行。

+1

只是为将来的人写的一个提示:在你的第一个代码块中,(后跟查询)确实执行了两个查询。但是,改变顺序(查询后跟get),你只能看到一个 - 因为第一级缓存开始了 - 查询填充缓存。这与ayendes“获取,加载,按ID查询”文章相反 - 但似乎引用了早期版本的linq驱动程序 –

0

不,据我所知他们没有。他们只使用二级缓存。首级缓存仅适用于GetLoad

相关问题