来自DataSet的C#唯一且不同的字段

时间:2011-11-08 16:08:16

标签: c# database arrays winforms combobox

有更好的方法来执行此功能吗?即使我在后台工作程序中进行实际查询,但是在查询发生时应用程序中有一点点暂停,所以想知道是否有更快的方法来执行此操作。

基本上,queries正在检查数据集中是否有来自特定列的唯一结果,以使用这些项填充comboBox。这使我们不必将任何选项硬编码到过滤器中,如果我们在服务器上为这些值添加项目,则在下次自动更新数据集时添加它们。

我只是不确定我使用的方法是否可以用更短,更快的格式完成:

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 :(得分:0)

你不是实际在后台线程中完成工作 - 你只是准备它。调用Distinct()只会构建一个IEnumerable<T>,当您迭代时会生成不同的项。你不会迭代它,直到“完成”方法,它将返回UI线程。

完全有可能通过强制查询在后台线程中执行来消除延迟,如下所示:

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

(显然其他值也一样)。