1

fact.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>都很慢。

谢谢你的时间。

4

2 回答 2

2

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

您可以使用相同的架构而不是 aCopyToDataTable创建一个新的,因为这对于 a 来说更自然。但是,正如我所提到的,这并不能解决您的性能问题。DataTableListIEnumerable<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 链接快得多?

于 2013-10-15T07:40:14.673 回答
0

请尝试以下。

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

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

于 2013-10-15T07:50:51.933 回答