[英]C# Unique and Distinct Fields from DataSet
有更好的方法來執行此功能嗎? 即使我在后台工作程序中進行實際查詢,在進行查詢時,應用程序中還是會有一些暫停,所以想知道是否有一種更快的方法。
本質上, 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);
}
您實際上並沒有在后台線程中進行工作-您只是在准備它。 調用Distinct()
只會構建一個IEnumerable<T>
, 當您對其進行迭代時 ,它將產生不同的項。 在“完成”方法之前,您不會對其進行迭代,該方法將返回UI線程中。
完全有可能通過強制在后台線程中執行查詢來消除延遲,如下所示:
queryStatus = demoCriteria.AsEnumerable()
.Select(row => row.Field<string>("ows_Status"))
.Distinct()
.ToList(); // Note this call!
(顯然,其他值也是如此)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.