【问题标题】:Query about Entity Framework caching查询实体框架缓存
【发布时间】:2014-03-09 23:54:05
【问题描述】:

假设我有这三种方法:

public Customer GetCustomerByCustomerGuid(Guid customerGuid)
{
    return GetCustomers().FirstOrDefault(c => c.CustomerGuid.Equals(customerGuid));
}

public Customer GetCustomerByEmailAddress(string emailAddress)
{
    return GetCustomers().FirstOrDefault(c => c.EmailAddress.Equals(emailAddress, StringComparison.OrdinalIgnoreCase));
}

public IEnumerable<Customer> GetCustomers()
{
    return from r in _customerRepository.Table select r;
}

//_customerRepository.Table is this:
public IQueryable<T> Table
{
    get { return Entities; }
}

这是否会在我每次调用 GetCustomerByEmailAddress() / GetCustomerByCustomerGuid() 时导致对数据库的查询,或者 EF 是否会缓存 GetCustomer() 的结果并查询我的信息?

另一方面,它是否只是缓存每次调用GetCustomerByEmailAddress()/GetCustomerByCustomerGuid()的结果

我正在尝试建立我应该达到的手动缓存级别,我真的不喜欢运行比绝对必要的更多的 SQL 查询。

【问题讨论】:

    标签: c# asp.net-mvc entity-framework caching asp.net-mvc-5


    【解决方案1】:

    是的,它每次都会查询数据库。

    您应该关注的是优化您的代码,使其只查询并返回您需要的记录。现在它正在拉回整个表,然后你用FirstOrDefault() 过滤它。

    public IEnumerable&lt;Customer&gt; GetCustomers() 更改为public IQueryable&lt;Customer&gt; GetCustomers() 以提高效率。

    【讨论】:

    • 这不是 LINQ to EF 的工作方式。 LINQ Provider 足够聪明,可以将FirstOrDefault() 转换为select top 1。基本上,用于 LINQ to EF 查询的任何具有等效 SQL 函数的查询方法都将作为 SQL 执行,以支持在 C# 中对结果集进行操作。
    • 如果它返回一个 IQueryable 而不是 IEnumerable。
    • @evanmcdonnal - 这也是我的理解。查询是根据完整的 LINQ 查询生成的。
    • @AnthonyChu - 在我的情况下,_customerRepository.TableIQueryable&lt;&gt;,但发帖人并不知道。
    • @AnthonyChu 你怎么知道GetCustomers()返回的类型?
    【解决方案2】:

    这将导致每次调用数据库。实际上我今天早些时候问了一个类似的问题,你可以在这里看到更多:Why does Entity Framework 6.x not cache results?

    【讨论】:

    • 啊,我明白了。出于兴趣,您如何查看 EF 是否正在访问数据库?
    • 我使用 SQL Server Profiler 跟踪对我的数据库的所有调用。
    • 我知道存在类似的东西,但在 SQL Express(我在家里使用)中看不到它。我会再深入一点。
    • 我猜这不是 SQL Express 的一部分。但它肯定会每次都调用数据库。不幸的是,我今天正在处理这个问题。
    • .Find() 就是这样。感谢您提供信息,我会将其标记为答案(编辑:4 分钟后 :))。
    猜你喜欢
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 2021-04-13
    • 2015-08-21
    相关资源
    最近更新 更多