有多贵。包含在实体框架中?

时间:2012-10-12 20:22:56

标签: asp.net-mvc entity-framework azure azure-sql-database

我在ASP.NET MVC操作方法中有以下简单查询。

IEnumerable<Company> query = unitOfWork.CompanyRepository.dbSet
    .Include("Adresses.PhoneNumbers")
    .Include("Adresses.FaxNumber")
    .Include("Emails").Where(q => q.CustomerCompany == true);

此操作方法通过ajax get请求调用,有时最多需要25秒!数据库中只有40家公司。每个公司都有单一的地址,最多只有几个PhoneNumbers和FaxNumbers。(有趣的是它有时需要200-500毫秒,但非常罕见)

如果我将此查询更改为以下

IEnumerable<Company> query = unitOfWork.CompanyRepository.dbSet
    .Where(q => q.CustomerCompany == true);

它只需要大约200毫秒。

所以我想知道为什么.Include如此昂贵。我的应用程序正在生产中,我正在使用SQL Azure和Azure网站。

感谢。

1 个答案:

答案 0 :(得分:2)

生成的SQL更复杂,但通常性能是由于LINQ查询编译开销造成的。您需要进行配置以确定。一种可能的解决方法是使用预编译查询,第二次和以后的查询速度会更快。更好的解决方法可能是仅使用您需要的数据的投影,而不是在查询中包含4个实体,这相当于所有4个表上的SELECT *。如果您需要所有这些完整实体,另一个可能的修复是显式加载细节,这意味着更多(但更快!)查询。