繁体   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