簡體   English   中英

從數據表中過濾行

[英]Filtering rows from DataTable

我有一個包含 1000000 條記錄的數據DataTable 我正在從DataTable過濾記錄。 我使用了多種過濾方法:

  • DataTable.Select()
  • Linq 到數據表
  • DataView.RowFilter

篩選記錄后,將結果記錄(約 1000 條記錄)綁定到 ListBox。

整個過程要花很多時間。 我分析了代碼,發現過濾花費了很多時間。 整個過程應該在幾毫秒內完成。 對於每次過濾,我都無法訪問服務器來獲取記錄。

請建議。

//using dataTable
DataRow[] dr = dtData.Select("i_pernr=" + perno + "");
dr.CopyToDataTable(dtTemp,LoadOption.OverwriteChanges);

//using DataView
dtData.DefaultView.RowFilter = "i_pernr=" + perno ;
dtTemp = dtData.DefaultView.ToTable();

//Using Linq
IEnumerable<DataRow> query = from m in dtData.AsEnumerable()
                             where m["i_pernr"] == perno
                             select m;
query.CopyToDataTable(dtTemp,LoadOption.OverwriteChanges);

如果您真的覺得無法在源頭進行過濾(SQL Server 在選擇記錄方面要好得多),您只能通過為DataTable設置PrimaryKey來加快選擇操作。

dtData.PrimaryKey = new DataColumn[] { dtData.Columns["i_pernr"]};

請注意,您可以將多個列作為主鍵列。 您必須根據需要添加盡可能多的內容,以確保您添加/擁有的數據行是唯一的。

我使用了以下測試裝置:

var dtTemp = new DataTable();
dtTemp.Columns.Add("i_pernr", typeof(int));
dtTemp.Columns.Add("name", typeof(string));

var dtData = new DataTable();
dtData.Columns.Add("i_pernr", typeof(int));
dtData.Columns.Add("name", typeof(string));
dtData.PrimaryKey = new DataColumn[] { 
    dtData.Columns["i_pernr"], 
    dtData.Columns["name"]
    };

var rnd = new Random();
for(int r = 1; r<1000000; r++)
{
    var row =dtData.NewRow();
    row[0] = rnd.Next(1000);
    row[1]= String.Format("the lazy fox jumps again {0}",rnd.Next(10000000)) ;
    try
    {
       dtData.Rows.Add(row);
    }
    catch
    {
       // Hey, for testing this is fine ...
    }
}

這會加載一個包含足夠行的數據表,以測試秒表是否具有 PrimaryKey 的效果:

dtData.Rows.Count.Dump("rows");

var perno = rnd.Next(1000).ToString();

var sw = new Stopwatch();
sw.Start();
DataRow[] dr = dtData.Select("i_pernr=" + perno + "");
dr.CopyToDataTable(dtTemp,LoadOption.OverwriteChanges);
sw.Stop();
sw.ElapsedMilliseconds.Dump("elapsed");
sw.ElapsedTicks.Dump("ticks");

使用 PrimaryKey 時 LinqPad 中的此輸出:

elapsed:    0 
ticks:  5,371

沒有主鍵,結果是:

elapsed:     2,444 
ticks:   7,541,415 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM