我有DataTable
,有1000000条记录。我正在过滤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);
答案 0 :(得分:0)
如果您确实觉得无法在源处进行过滤(SQL Sever在选择记录方面要好得多),则只能通过为DataTable设置PrimaryKey
来加快选择操作。
dtData.PrimaryKey = new DataColumn[] { dtData.Columns["i_pernr"]};
请注意,您可以将多列作为primarykey列。您需要添加尽可能多的内容来保证您添加/拥有的数据行是唯一的。
我使用了以下测试台:
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