有更好的方法来执行此功能吗?即使我在后台工作程序中进行实际查询,但是在查询发生时应用程序中有一点点暂停,所以想知道是否有更快的方法来执行此操作。
基本上,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);
}
答案 0 :(得分:0)
你不是实际在后台线程中完成工作 - 你只是准备它。调用Distinct()
只会构建一个IEnumerable<T>
,当您迭代时会生成不同的项。你不会迭代它,直到“完成”方法,它将返回UI线程。
完全有可能通过强制查询在后台线程中执行来消除延迟,如下所示:
queryStatus = demoCriteria.AsEnumerable()
.Select(row => row.Field<string>("ows_Status"))
.Distinct()
.ToList(); // Note this call!
(显然其他值也一样)。