林克与数据表 .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() 非常慢

首先,不是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 参数。选择方法。