2

我在 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 秒。

编辑

我在DataView's Poor Performance with Large RecordSets上找到了这个链接

4

3 回答 3

2

由于您没有返回 aDataView而是 a DataTable,因此您应该能够通过使用来获得性能提升 - 不是数量级,而是 25-30% 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;
}

大部分时间都在将数据复制到新表中。如果您可以避免创建新表并使用返回的DataRows数组,DataTable.Select您可以获得相当大的改进。

于 2009-11-03T02:32:40.423 回答
1

使用所有可用的索引和统计信息在数据库中排序可能会更快,特别是如果您在显示给用户之前对结果进行分页。

于 2009-11-03T00:13:32.537 回答
1

我同意盛的观点,当你必须对 50 - 100k 行进行排序时,是时候将一些逻辑移至仅用于此目的的层,即数据库。创建一个将行限制和当前页面作为参数的存储过程,或者根据这些值构建您的选择语句,.NET 速度很快,但没有针对这些操作进行优化,其中作为 SQL 服务器(或任何 RDBMS) )。

于 2009-11-03T00:18:27.370 回答