林克与数据表 .ToList() 非常慢
本文关键字:非常 ToList 数据表 林克 | 更新日期: 2023-09-27 18:35:18
facts.底层数据表是一个数据表
var queryResults4 = //get all facts
(from f in facts.UnderlyingDataTable.AsEnumerable()
where f.RowState != DataRowState.Deleted &&
FactIDsToSelect.Contains(f.Field<int>("FactID"))
select f);
var queryResults5 = (from f in queryResults4.AsEnumerable()
orderby UF.Rnd.Next()
select f);
return queryResults5.ToList();
问题是这条线queryResults5.ToList();
它返回数据行的列表。但是这样做非常慢。
我很高兴返回任何实现IEnumerable
的对象。我该怎么办?我似乎从 var 到 List<DataRow>
的转换很慢。
谢谢你的时间。
首先,不是ToList
本身很慢,而是在此方法中执行的查询。因此,也许您的DataTable
包含许多行。我还假设FactIDsToSelect
很大,这使得Contains
检查每一行都很慢.
您可以使用CopyToDataTable
创建具有相同架构而不是List
的新DataTable
,因为这对于IEnumerable<DataRow>
来说更自然。但是,正如我所提到的,这并不能解决您的性能问题。
Join
来优化查询:
var q = from row in UnderlyingDataTable.AsEnumerable()
where row.RowState != DataRowState.Deleted
join id in FactIDsToSelect
on row.Field<int>("FactID") equals id
select row;
var newTable = q.CopyToDataTable();
为什么 LINQ JOIN 比与 WHERE 链接快得多?
请尝试以下方法。
List<DataRow> list = new List<DataRow>(UnderlyingDataTable.Select("FactID = " + id.ToString(),DataViewRowState.Unchanged));
您可能需要更改 中的 DataViewRowState 参数。选择方法。