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

use*_*310 2 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; }
}
Run Code Online (Sandbox Code Playgroud)

小智 5

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

// 3  
return query
    //.ToList() //This will cause performance issues
    .Skip((page - 1) * pageSize)
    .Take(pageSize)
    .ToList();
Run Code Online (Sandbox Code Playgroud)

点击此处查看说明:多次调用ToList会影响性能吗?

如果你离第一页太远,Skip和Take也可能有问题,请检查一下:实体Framerowk Skip/Take在跳过的数字很大时很慢