使用实体框架包含查询运行速度极慢

时间:2017-06-16 15:10:50

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

我有课程ProcessMessageProcessMessage详情。有1对多关系,1 ProcessMessage可以有很多ProcessMessageDetail。我使用Entity Framework 6编写了代码,但运行速度非常慢。

优化它的任何提示?如果你在第3步看到它,我正在使用ToList()。第1步和第2步是IQueryable

// 1
var query =  UnitOfWorkAsync.Repository<ProcessMessage>()
                            .Queryable()
                            .Include(x => x.ProcessMessages)                     
                            .Include(x => x.TestDetail)
                            .AsNoTracking()
                            .AsExpandable()
                            .Where(Query(loggedProcess, status))
                            .Take(1000)
                            .AsQueryable();   

// 2        
query = query.OrderBy(sortBy + (reverse ? " descending" : "")).AsQueryable();


// 3  
return query
    .ToList()
    .Skip((page - 1) * pageSize)
    .Take(pageSize)
    .ToList();


public class ProcessMessage
{
    public ProcessMessage()
    {
        ProcessMessages = new List<ProcessMessageDetail>();
    }
    public int ProcessMessageId { get; set; }
    public int? LoggedProcessId { get; set; }
    public int? ProcessMessageTypeId { get; set; }  
    public virtual LoggedProcess LoggedProcess { get; set; }     
    public virtual ICollection<ProcessMessageDetail> ProcessMessages { get; set; }
}

1 个答案:

答案 0 :(得分:5)

最可能的罪魁祸首是第三步中的第一个ToList。

$('.masterRecords').on('click', function(){
    console.log($(this).siblings('input').prop('id'));
});

点击此处查看说明:Does calling ToList multiple times effect performance?

如果您距离第一页太远,Skip和Take也可能存在问题,请查看:Entity Framerowk Skip/Take is very slow when number to skip is big