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# 带有DataTable.ToList()的Linq非常慢_C#_Linq_Datatable_Tolist - Fatal编程技术网

C# 带有DataTable.ToList()的Linq非常慢

C# 带有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()中的

facts.UnderlineDataTable是一个DataTable


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));