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 实现了不同的缓存级别和缓存失效程序,我现在不会深入探讨。