C# 带有DataTable.ToList()的Linq非常慢
facts.UnderlineDataTable是一个DataTableC# 带有DataTable.ToList()的Linq非常慢,c#,linq,datatable,tolist,C#,Linq,Datatable,Tolist,facts.UnderlineDataTable是一个DataTable var queryResults4=//获取所有事实 (来自facts.underyingDataTable.AsEnumerable()中的f) 其中f.RowState!=DataRowState.Deleted&& FactIDsToSelect.Contains(f.Field(“FactID”)) 选择f); var queryResults5=(来自queryResults4.AsEnumerable()中的
var queryResults4=//获取所有事实
(来自facts.underyingDataTable.AsEnumerable()中的f)
其中f.RowState!=DataRowState.Deleted&&
FactIDsToSelect.Contains(f.Field(“FactID”))
选择f);
var queryResults5=(来自queryResults4.AsEnumerable()中的f)
orderby UF.Rnd.Next()
选择f);
返回queryResults5.ToList();
问题是这一行queryResults5.ToList()代码>
它返回一个数据行列表。但这样做的速度非常慢
我很乐意返回实现IEnumerable
的任何对象。我该怎么办?我觉得从var到List
的转换很慢
谢谢您的时间。首先,不是ToList
本身很慢,而是使用此方法执行的查询。因此,您的数据表可能包含许多行。我还假设FactIDsToSelect
很大,这使得包含的每行检查都很慢
您可以使用CopyToDataTable
创建具有相同模式的新DataTable
,而不是列表
,因为这对于IEnumerable
更为自然。然而,正如我所提到的,这并不能解决您的性能问题
您可以使用效率更高的连接来优化查询:
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();
var q=underyingDataTable.AsEnumerable()中的行
where row.RowState!=数据行状态。已删除
在FactIDsToSelect中加入id
第行字段(“FactID”)等于id
选择行;
var newTable=q.CopyToDataTable();
请尝试以下内容
List<DataRow> list = new List<DataRow>(UnderlyingDataTable.Select("FactID = " + id.ToString(),DataViewRowState.Unchanged));
List List List=新列表(UnderlyingDataTable.Select(“FactID=“+id.ToString(),DataViewRowState.Unchanged));
您可能需要更改.Select方法中的DataViewRowState参数。太好了,看起来确实快了很多!“谢谢你的帮助。”文森特范德维埃尔:考虑一下。出于兴趣,之前花了多长时间?现在花了多长时间?我真的没有时间。但我想说至少快了4倍。我加入了FactIDsToSelect的查询,现在它快了很多。谢谢你抽出时间。
List<DataRow> list = new List<DataRow>(UnderlyingDataTable.Select("FactID = " + id.ToString(),DataViewRowState.Unchanged));