【发布时间】:2016-03-29 06:41:54
【问题描述】:
我有序列号列表,并希望从数据表中提取与这些数字相对应的行并针对 ID。我正在使用以下 LINQ 查询:
//list of serial numbers
var serialNumAlreadyExisted = [1,2,3];
var varID = 2;
//get the corresponding rows for these serial numbers
var duplicateRows = (from row in dt.AsEnumerable()
where row.Field<int>("ID") == varID &&
serialNumAlreadyExisted.Any(sr => sr == row.Field<string>("SERIAL_NUMBER"))
select row).ToList();
上述代码适用于 1-2K 行,但如果数据表中有 50K 序列号和 50K 条记录,则需要大量时间。
有什么办法可以优化它并减少处理时间?
【问题讨论】:
-
serialNumAlreadyExisted.Contains(row.Field<string>("SERIAL_NUMBER"))怎么样? -
你可以
join这两个,这可能是我会做的,但我怀疑性能改进在内存集上会那么明显。事实上,我很惊讶您注意到内存中的所有内容都存在差异。我记得DataTables 是急切加载的吗?这些天有他们的懒惰版本吗?如果加载数据需要更长的时间,我肯定会相信,但我假设这已被排除? -
尝试使用
DataTable.Select方法。例如(测试性能的硬编码示例):DataRow[] dupes = dt.Select(String.Format("Id = 2 AND SERIAL_NUMBER IN ('1','2','3')"));
标签: c# performance linq datatable