可以在请求开始时启用广告并在请求结束时结束吗?
对于某些表,启用不会多次选择相同记录的缓存非常有用。
例如,当我多次渲染部分时,部分内部的SELECT是不必要的。
假设此代码段:
@foreach(var row in orders)
{
@{Html.RenderPartial("Order");}
}
部分订单是:
<div>
@session.Query<Langs>.SingleOrDefault(el => el.Id == "EN').Description
</div>
<div>
@Model.OrderID
</div>
可以启用仅在当前会话中缓存“Langs”表的缓存吗?
没有缓存,每个请求都有N(订单计数)SELECT,否则对于请求缓存,每个请求将有1个SELECT。
谢谢!
答案 0 :(得分:2)
您不应该在任何视图中执行任何数据库查询,例如您提到的部分。这几乎总会导致SELECT N + 1场景。
遵循MVC模式,不要混淆问题。应从存储库层启动任何数据库查询,然后填充表示视图所需数据的模型对象,然后将该模型传递给视图。
通过编程,一切皆有可能,总有一百万种方法可以做同样的事情,但遵循最佳实践和关注点分离将使您免于自己,并帮助您构建高效,可扩展和可维护的应用程序。
重申一下,无论您的视图需要访问哪些数据,都要在MVC模式的Controller端进行所有查询。以任何其他方式这样做是混合问题并导致诸如你遇到的情况之类的情况。
答案 1 :(得分:1)
你至少有2个可能性:
查询:
@session.Query<Langs>.SetCacheable(true).SingleOrDefault(el => el.Id == "EN').Description
将hibernate.cache.use_query_cache = true键添加到配置