C# 从数据表中筛选行
我有一个包含1000000条记录的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
DataTable
。我正在从数据表
中筛选记录。我使用了各种过滤方法:
DataTable.Select()
- Linq到数据表
DataView.RowFilter
//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