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のパフォーマンスの低下で見つかりました

4

3 に答える 3

2

DataViewa ではなく 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;
}

ほとんどの時間は、データを新しいテーブルにコピーすることに費やされています。新しいテーブルを作成せずに、返さDataRowれる sの配列DataTable.Selectを操作できれば、かなりの改善が得られます。

于 2009-11-03T02:32:40.423 に答える
1

ここでShengに同意します。50〜100,000行を並べ替える必要がある場合は、そのためだけに使用されるレイヤーであるデータベースにロジックを移動する必要があります。行制限と現在のページをパラメーターとして受け取るストアドプロシージャを作成するか、これらの値に基づいてselectステートメントを作成します。.NETは高速ですが、SQLサーバー(またはその他のRDBMS)のように、この種の操作には最適化されていません。 )。

于 2009-11-03T00:18:27.370 に答える
1

特にユーザーに表示する前に結果をページ分割する場合は、利用可能なすべてのインデックスと統計を使用してデータベースでソートする方が速い場合があります。

于 2009-11-03T00:13:32.537 に答える