LINQ 是否正在查询数据库,使我的缓存变得无用?
Is LINQ querying the database, making my caching useless?
所以我有这样的代码:
var attribute = _genericAttributeService
.GetAttributesForEntity(_workContext.CurrentCustomer.Id, "Customer")
.FirstOrDefault(x => x.Key == "CompareProducts");
GetAttributesForEntity
看起来像这样:
public virtual IList<GenericAttribute> GetAttributesForEntity(int entityId, string keyGroup)
{
return _cacheManager.Get(string.Format(GENERICATTRIBUTE_KEY, entityId, keyGroup), () =>
{
var query = from ga in _genericAttributeRepository.Table
where ga.EntityId == entityId &&
ga.KeyGroup == keyGroup
select ga;
var attributes = query.ToList();
return attributes;
});
}
所以它使用缓存来减少数据库查询。
FirstOrDefault()
是在查询返回的列表,还是在进行另一个数据库查询?
最好知道这里到底发生了什么。
Is the FirstOrDefault() now querying the returned list, or is another
database query made?
简答:
FirstOrDefault 将查询缓存列表。
长答案:
_cacheManager 将使用提供的参数 (entityId, keyGroup)
从缓存中检索列表。
如果元素不在缓存中,它将执行 lambda 从数据库中检索数据,并将结果存储在键 (entityId, keyGroup)
.
中
它将存储完整的 List<>
。注意声明:
var attributes = query.ToList();
因此,如果您使用相同的参数重复调用 GetAttributesForEntity
,您将获得存储的结果。
注意:NopCommerce 实现了不同的缓存级别和缓存失效程序,我现在不会深入探讨。
所以我有这样的代码:
var attribute = _genericAttributeService
.GetAttributesForEntity(_workContext.CurrentCustomer.Id, "Customer")
.FirstOrDefault(x => x.Key == "CompareProducts");
GetAttributesForEntity
看起来像这样:
public virtual IList<GenericAttribute> GetAttributesForEntity(int entityId, string keyGroup)
{
return _cacheManager.Get(string.Format(GENERICATTRIBUTE_KEY, entityId, keyGroup), () =>
{
var query = from ga in _genericAttributeRepository.Table
where ga.EntityId == entityId &&
ga.KeyGroup == keyGroup
select ga;
var attributes = query.ToList();
return attributes;
});
}
所以它使用缓存来减少数据库查询。
FirstOrDefault()
是在查询返回的列表,还是在进行另一个数据库查询?
最好知道这里到底发生了什么。
Is the FirstOrDefault() now querying the returned list, or is another database query made?
简答:
FirstOrDefault 将查询缓存列表。
长答案:
_cacheManager 将使用提供的参数 (entityId, keyGroup)
从缓存中检索列表。
如果元素不在缓存中,它将执行 lambda 从数据库中检索数据,并将结果存储在键 (entityId, keyGroup)
.
它将存储完整的 List<>
。注意声明:
var attributes = query.ToList();
因此,如果您使用相同的参数重复调用 GetAttributesForEntity
,您将获得存储的结果。
注意:NopCommerce 实现了不同的缓存级别和缓存失效程序,我现在不会深入探讨。