使用基于文本的过滤器并重新绑定时,ObjectListview非常慢

时间:2018-10-09 09:32:43

标签: c# objectlistview

特别是在应用文本过滤器时,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填充器,这些填充器使我可以从已检查的更改事件中调用这些功能。

enter image description here

编辑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;
        }
 }

0 个答案:

没有答案