C # Уникальные и отличные поля от DataSet - PullRequest
1 голос
/ 08 ноября 2011

Есть ли лучший способ сделать эту функцию?Несмотря на то, что я делаю фактический запрос внутри фонового рабочего, в приложении есть небольшая пауза во время выполнения запроса, поэтому мне было интересно, есть ли более быстрый способ сделать это.

По сути, queries проверяет набор данных на предмет уникальных результатов из определенных столбцов, чтобы заполнить комбинированный список этими элементами.Это позволяет нам не кодировать какие-либо параметры в фильтрах, и если мы добавляем элементы на сервер для этих значений, они добавляются при следующем обновлении набора данных автоматически.

Я просто неуверен, что используемые мной методы могут быть выполнены в более коротком и быстром формате:

private IEnumerable<string> queryStatus;
private IEnumerable<string> queryPriority;
private IEnumerable<string> queryCompany;
private IEnumerable<string> queryCategory;

private void filterBuilder_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
   {
       Console.WriteLine(DateTime.Now.ToString());
       DataTable demoCriteria = Ds.Tables[1];
       queryStatus = (demoCriteria.AsEnumerable().Select(row => row.Field<string>("ows_Status"))).Distinct();
       queryPriority = (demoCriteria.AsEnumerable().Select(row => row.Field<string>("ows_Priority"))).Distinct();
       queryCompany = (demoCriteria.AsEnumerable().Select(row => row.Field<string>("ows_Company"))).Distinct();
       queryCategory = (demoCriteria.AsEnumerable().Select(row => row.Field<string>("ows_Category"))).Distinct();
   }

private void filterBuilder_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
   {
       foreach (string row in queryStatus)
       {
           if (!viewFilter_Status.Items.Contains(row))
               viewFilter_Status.Items.Add(new ComboBoxItem(row,
                                                           row));
           if (!editStatus.Items.Contains(row))
               editStatus.Items.Add(new ComboBoxItem(row,
                                                     row));
           if (!newStatus.Items.Contains(row))
               newStatus.Items.Add(new ComboBoxItem(row,
                                                    row));
       }
       foreach (string row in queryPriority)
       {
           if (!viewFilter_Priority.Items.Contains(row))
               viewFilter_Priority.Items.Add(new ComboBoxItem(row,
                                                              row));
           if (!editPriority.Items.Contains(row))
               editPriority.Items.Add(new ComboBoxItem(row,
                                                       row));
           if (!newPriority.Items.Contains(row))
               newPriority.Items.Add(new ComboBoxItem(row,
                                                      row));
       }
       foreach (string row in queryCompany)
       {
           if (!viewFilter_Company.Items.Contains(row))
               viewFilter_Company.Items.Add(new ComboBoxItem(row,
                                                             row));
           if (!editCompany.Items.Contains(row))
               editCompany.Items.Add(new ComboBoxItem(row,
                                                      row));
           if (!newCompany.Items.Contains(row))
               newCompany.Items.Add(new ComboBoxItem(row,
                                                     row));
       }
       foreach (string row in queryCategory)
       {
           if (!viewFilter_Product.Items.Contains(row))
               viewFilter_Product.Items.Add(new ComboBoxItem(row,
                                                             row));
           if (!editProduct.Items.Contains(row))
               editProduct.Items.Add(new ComboBoxItem(row,
                                                      row));
           if (!newProduct.Items.Contains(row))
               newProduct.Items.Add(new ComboBoxItem(row,
                                                     row));
           }

       MainFormCallbacks.EnableISTab(true);
   }

1 Ответ

0 голосов
/ 08 ноября 2011

Вы не на самом деле выполняете работу в фоновом потоке - вы просто готовите это. Вызов Distinct() только создает IEnumerable<T>, который даст отдельные элементы , когда вы перебираете его . Вы не будете перебирать его до тех пор, пока не будет завершен метод, который вернется в поток пользовательского интерфейса.

Вполне возможно, что вы можете избавиться от задержки, принудительно выполнив запрос в фоновом потоке, например:

 queryStatus = demoCriteria.AsEnumerable()
                           .Select(row => row.Field<string>("ows_Status"))
                           .Distinct()
                           .ToList(); // Note this call!

(и то же самое для других значений, очевидно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...