I have class ProcessMessage and ProcessMessage detail. There is 1 to many relationship , 1 ProcessMessage can have many ProcessMessageDetail. I have written the code using Entity Framework 6 but its running extremely slow.
Any tips for optimizing it? If you see its at step 3, I am using ToList(). Step 1 and step 2 is an 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; }
}
ToList()beforeSkip()andTake()really jumps out at me, sinceToList()will return a list with all data at that point. The paging will happen in memory, rather than in sql.AsQueryablecalls, but I don't think they will affect performance.OrderBywrong for descending items. To get a descending sort useOrderByDescendinginstead.