特别是在应用文本过滤器时,ef6和对象列表视图出现严重的速度问题。当我一无所有时,一切都很好。
private void FilterJobs()
{
Cursor = Cursors.WaitCursor;
if (jobsFilterTextBox.Text.Length > 0)
{
jobsList.ModelFilter = new TextMatchFilter(jobsList, jobsFilterTextBox.Text, StringComparison.InvariantCultureIgnoreCase);
jobsFilterButton.Enabled = false;
jobsClearFilterButton.Enabled = true;
jobsFilterLabel.Text = string.Format("{0} of {1} records", jobsList.Items.Count, ((System.Collections.ArrayList)jobsList.Objects).Count);
}
Cursor = Cursors.Default;
}
我通过以下方法将作业列表设置为该列表。
private void BindJobs()
{
try
{
List<Job> jobs = null;
if (showLiveJobsOnlyCheckBox.Checked)
{
jobs = new JobRepository(new UnitOfWork()).Find(x => x.JobStatusID != (int) JobStatusEnum.Cancelled && x.JobStatusID != (int) JobStatusEnum.Complete).OrderByDescending(x => x.ID).ToList();
}
else
{
jobs = new JobRepository(new UnitOfWork()).GetAll().OrderByDescending(x => x.ID).ToList();
}
jobsList.LoadObjects(jobs);
}
catch (Exception ex)
{
ExceptionManager.HandleUnexpectedException(ex);
}
}
以下是我从上述方法和getall方法中找到的方法。
public override IQueryable<Job> Find(Expression<Func<Job, bool>> predicate)
{
return DbSet
.Include(x => x.JobLines).AsNoTracking()
.Include(x => x.Customer).AsNoTracking()
.Include(x => x.SysCurrency).AsNoTracking()
.Include(x => x.JobStatus).AsNoTracking()
.Where(predicate);
}
我的Getall方法。
public virtual IEnumerable<T> GetAll()
{
return DbSet.AsNoTracking().AsEnumerable().ToList();
}
如您所见,我添加了asnotracking,希望它可以加快速度并且初始加载很快,但是当用户选择仅显示实时作业但客户名称仍在过滤器中的部分时,其速度将非常缓慢。
编辑2
这向我展示了如何使用Performance Pro填充器,这些填充器使我可以从已检查的更改事件中调用这些功能。
编辑3
显示我的加载对象的方法。
public static void LoadObjects(this ObjectListView objectListView, IEnumerable objects)
{
Form form = objectListView.FindForm();
try
{
if (form != null)
form.Cursor = Cursors.WaitCursor;
objectListView.BeginUpdate();
objectListView.ClearObjects();
objectListView.SetObjects(objects);
}
finally
{
objectListView.EndUpdate();
if (form != null)
form.Cursor = Cursors.Default;
}
}