ObjectListview очень медленно работает с текстовым фильтром и перепривязывается - PullRequest
0 голосов
/ 09 октября 2018

У меня серьезные проблемы со скоростью, связанные с 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 Filler, который приводит меня к этим функциям, которые вызываются из проверенного измененного события.

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;
        }
 }
...