Linq与DataTable .ToList()非常慢

时间:2013-10-15 07:33:00

标签: c# linq datatable tolist

facts.UnderlyingDataTable是一个DataTable


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

返回DataRows列表。但这样做是非常缓慢的。

我很高兴返回任何实现IEnumerable的对象。我该怎么办?我似乎从var到List<DataRow>的转换很慢。

感谢您的时间。

2 个答案:

答案 0 :(得分:2)

首先,ToList本身并不慢,而是在此方法中执行的查询。所以也许你的DataTable包含很多行。我还假设FactIDsToSelect很大,这使Contains检查每一行都很慢。

您可以使用CopyToDataTable创建具有相同架构的新DataTable,而不是List,因为这对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();

Why is LINQ JOIN so much faster than linking with WHERE?

答案 1 :(得分:0)

请尝试以下操作。

List<DataRow> list = new List<DataRow>(UnderlyingDataTable.Select("FactID = " + id.ToString(),DataViewRowState.Unchanged));

您可能需要在.Select方法中更改DataViewRowState参数。