[英]Filtering rows from DataTable
我有一個包含 1000000 條記錄的數據DataTable
。 我正在從DataTable
過濾記錄。 我使用了多種過濾方法:
DataTable.Select()
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.