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>
的转换很慢。
感谢您的时间。
答案 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();
答案 1 :(得分:0)
请尝试以下操作。
List<DataRow> list = new List<DataRow>(UnderlyingDataTable.Select("FactID = " + id.ToString(),DataViewRowState.Unchanged));
您可能需要在.Select方法中更改DataViewRowState参数。