从DataTable过滤行

时间:2015-08-29 07:58:42

标签: c# linq datatable dataview

我有DataTable,有1000000条记录。我正在过滤DataTable的记录。我使用了各种方法进行过滤:

  • DataTable.Select()
  • Linq to DataTable
  • 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);

1 个答案:

答案 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