我在DataView.Sort上遇到了性能瓶颈。代码如下。
/// <summary>
/// Filters the data table and returns a new data table with only the filtered rows.
/// </summary>
/// <param name="dtInput">The dt input.</param>
/// <param name="filterExpression">The filter expression.</param>
/// <returns></returns>
protected virtual DataTable FilterDataTable(DataTable dtInput, string filterExpression)
{
DataTable result = dtInput;
if (!string.IsNullOrEmpty(filterExpression) && filterExpression.Trim().Length > 0)
{
DataView view = new DataView(dtInput);
view.RowFilter = filterExpression;
view.Sort = HierarchyFieldMap.DisplayedValue;
result = view.ToTable();
}
return result;
}
有关如何改进此方法的想法吗?
执行需要约1秒钟。
修改
上找到了这个链接答案 0 :(得分:2)
由于您没有返回DataView
而是DataTable
,因此您应该能够通过使用{{来提升性能 - 不是数量级,而是25-30% - 1}}:
DataTable.Sort
大部分时间都在将数据复制到新表中。如果您可以避免创建新表并使用private static DataTable SortDataTable(DataTable t,
string filterExpression,
string sortExpression)
{
DataTable t1 = t.Clone();
t1.BeginLoadData();
foreach (DataRow r in t.Select(filterExpression, sortExpression))
{
t1.Rows.Add(r.ItemArray);
}
t1.EndLoadData();
return t1;
}
返回的DataRow
数组,那么您可以获得相当大的改进。
答案 1 :(得分:1)
使用所有可用的索引和统计信息对数据库进行排序可能会更快,特别是如果在显示给用户之前对结果进行分页。
答案 2 :(得分:1)
我同意盛在这里,当你需要排序50到100k行时,是时候将一些逻辑移动到专门用于数据库的层。创建一个存储过程,它将rowlimit和current页面作为参数,或者jsut根据这些值构建你的select语句,.NET很快,但没有针对这些类型的操作进行优化,其中作为SQL服务器(或任何RDBMS) )。