如何减少实体框架Linq查询执行时间?

时间:2017-04-20 13:23:45

标签: c# entity-framework linq

我在ASP.NET MVC应用程序中使用Entity Framework,我在通过LINQ从SQL Server加载数据时遇到了问题。我的查询在4秒内返回结果,但我需要花费更少的时间,仍在寻找更好的解决方案。

这是我的linq查询:

var user =
    context.CreateObjectSet<DAL.ProductMaster>()
        .AsNoTracking()
        .Include("Product1").AsNoTracking()
        .Include("Product2").AsNoTracking()
        .Include("Product3").AsNoTracking()
        .Include("Product4").AsNoTracking()
        .Include("Product5").AsNoTracking()

        .Where(x => x.Id == request.Id)
         ).FirstOrDefault();

2 个答案:

答案 0 :(得分:0)

无需让多个实体在Where()中完成谓词,然后选择第一个;只需直接致电FirstOrDefault()即可。

if (request == null || organizationsList == null || !organizationsList.Any())
    return; 

var user = context.CreateObjectSet<DAL.User>()
                  .AsNoTracking()
                  .Include("UsersinPrograms.FollowUps")
                  .Include() ...
                  .FirstOrDefault(x => x.Id == request.userId && organizationsList.Contains(x.OrganizationId)));

此外,删除您不需要的Include()

答案 1 :(得分:0)

对于此和任何大规模业务逻辑操作,应该创建存储过程而不是基于Linq。然后在EF中创建一个DTO对象来处理结果并使用EF中的过程。

此时获得或丢失的速度取决于程序sql的结构,并着眼于数据库中使用的索引可能提供速度增强。

Linq SQL真的是样板,不是为速度而设计的。

我已经完成了多个EF项目。

还可以在Linqpad中构建他们的linq查询,然后切换到查看生成的SQL。这将提供如何在存储过程中构造一个SQL的想法。

此外,您可以考虑使用SQL CTE(通用表格表达式)一次一步地构建查询,直到数据符合需要为止。