Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从数据表中筛选行_C#_Linq_Datatable_Dataview - Fatal编程技术网

C# 从数据表中筛选行

C# 从数据表中筛选行,c#,linq,datatable,dataview,C#,Linq,Datatable,Dataview,我有一个包含1000000条记录的DataTable。我正在从数据表中筛选记录。我使用了各种过滤方法: DataTable.Select() Linq到数据表 DataView.RowFilter 过滤记录后,将结果记录(约1000条记录)绑定到列表框 整个过程花了很多时间。我分析了代码,发现过滤要花很多时间。整个过程应在毫秒内完成。对于每次筛选,我都无法点击服务器获取记录 请建议 //using dataTable DataRow[] dr = dtData.Select("i_pernr

我有一个包含1000000条记录的
DataTable
。我正在从
数据表
中筛选记录。我使用了各种过滤方法:

  • DataTable.Select()
  • Linq到数据表
  • DataView.RowFilter
过滤记录后,将结果记录(约1000条记录)绑定到列表框

整个过程花了很多时间。我分析了代码,发现过滤要花很多时间。整个过程应在毫秒内完成。对于每次筛选,我都无法点击服务器获取记录

请建议

//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);
//使用数据表
DataRow[]dr=dtData。选择(“i_pernr=“+perno+”);
dr.CopyToDataTable(dtTemp、LoadOption.OverwriteChanges);
//使用数据视图
dtData.DefaultView.RowFilter=“i_pernr=“+perno;
dtTemp=dtData.DefaultView.ToTable();
//使用Linq
IEnumerable query=来自dtData.AsEnumerable()中的m
其中m[“i_pernr”]==perno
选择m;
CopyToDataTable(dtTemp、LoadOption.OverwriteChanges);

如果您确实觉得不可能在源位置进行筛选(SQL Server在选择记录方面做得更好),则只能通过为
数据表设置
,来加快选择操作

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时,此输出在LinqPad中:

elapsed:    0 
ticks:  5,371
如果没有primarykey,结果是:

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

除非你提供你的代码,否则我怀疑你在这里会得到任何有用的帮助。Lakh不是印度以外的数字。我正在使用此代码。大约需要1秒的时间。这是什么:列表查询=(来自dtData.AsEnumerable()中的m,其中m[“I_pernr”]==perno select m).ToList();最好的解决方案是只检索您首先需要显示的1000行。。。。。
elapsed:     2,444 
ticks:   7,541,415