0

そのため、エンティティを DataTable に変換するメソッドがあります。唯一の問題は、非常に遅いことです。IQueryable で .ToList() を呼び出して、結果を DataTable に処理する前に先に進んでロードするようにしました。3000 行以上をメモリにロードするのにほとんど時間がかかりません。ただし、リアルタイムのスレイヤーは、メソッドの次の反復にあります。

foreach (var index in imgLeaseIndexes)
        {
            DataRow dataRow = dataTable.NewRow();

            dataRow["StateCode"] = index.StateCode;
            dataRow["CountyCode"] = index.CountyCode;
            dataRow["EntryNumber"] = index.EntryNumber;
            dataRow["Volume"] = index.Volume;
            dataRow["Page"] = index.Page;
            dataRow["PageCount"] = index.ImgLocation.PageCount;
            dataRow["CreateDate"] = index.ImgLocation.CreateDate;

            dataTable.Rows.Add(dataRow);
        }

そして、これが価値のある完全な方法です:

private DataTable buildImgLeaseIndexDataTable(List<ImgLeaseIndex> imgLeaseIndexes)
    {
        var dataTable = new DataTable();
        var dataColumns = new List<DataColumn>(); 
        var tdiReportProperties = 
            new List<string>() { "StateCode", "CountyCode", "EntryNumber", "Volume", "Page", "PageCount", "CreateDate" };

        Type imgLeaseIndexType = imgLeaseIndexes.FirstOrDefault().GetType();
        PropertyInfo[] imgLeaseIndexPropertyInfo = imgLeaseIndexType.GetProperties();

        dataColumns.AddRange(
            (from propertyInfo in imgLeaseIndexPropertyInfo
             where tdiReportProperties.Contains(propertyInfo.Name)
             select new DataColumn()
             {
                 ColumnName = propertyInfo.Name,
                 DataType = (propertyInfo.PropertyType.IsGenericType && 
                    propertyInfo.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>)) ? 
                    propertyInfo.PropertyType.GetGenericArguments()[0] : propertyInfo.PropertyType
             })
             .ToList());

        Type imgLocationType = imgLeaseIndexes.FirstOrDefault().ImgLocation.GetType();
        PropertyInfo[] imgLocationPropertyInfo = imgLocationType.GetProperties();

        dataColumns.AddRange(
            (from propertyInfo in imgLocationPropertyInfo
             where tdiReportProperties.Contains(propertyInfo.Name)
             select new DataColumn()
             {
                 ColumnName = propertyInfo.Name,
                 DataType = (propertyInfo.PropertyType.IsGenericType &&
                    propertyInfo.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>)) ?
                    propertyInfo.PropertyType.GetGenericArguments()[0] : propertyInfo.PropertyType
             })
             .ToList());

        dataTable.Columns.AddRange(dataColumns.ToArray());

        foreach (var index in imgLeaseIndexes)
        {
            DataRow dataRow = dataTable.NewRow();

            dataRow["StateCode"] = index.StateCode;
            dataRow["CountyCode"] = index.CountyCode;
            dataRow["EntryNumber"] = index.EntryNumber;
            dataRow["Volume"] = index.Volume;
            dataRow["Page"] = index.Page;
            dataRow["PageCount"] = index.ImgLocation.PageCount;
            dataRow["CreateDate"] = index.ImgLocation.CreateDate;

            dataTable.Rows.Add(dataRow);
        }

        return dataTable;
    }

これをより効率的にする方法と、なぜそれほど遅いのかについて、誰かがアイデアを持っていますか?

アップデート:

これまでに受け取ったフィードバックに従って、リフレクションを削除し、コンパイル時にデータ列を明示的に設定しましたが、それでも非常に遅いです。更新されたコードは次のようになります。

private DataTable buildImgLeaseIndexDataTable(List<ImgLeaseIndex> imgLeaseIndexes)
    {
        var dataTable = new DataTable();

        var stateCodeDataColumn = new DataColumn();
        stateCodeDataColumn.ColumnName = "StateCode";
        stateCodeDataColumn.Caption = "State Code";
        stateCodeDataColumn.DataType = typeof(Int16);
        dataTable.Columns.Add(stateCodeDataColumn);

        var countyCodeDataColumn = new DataColumn();
        countyCodeDataColumn.ColumnName = "CountyCode";
        countyCodeDataColumn.Caption = "County Code";
        countyCodeDataColumn.DataType = typeof(Int16);
        dataTable.Columns.Add(countyCodeDataColumn);

        var entryNumberDataColumn = new DataColumn();
        entryNumberDataColumn.ColumnName = "EntryNumber";
        entryNumberDataColumn.Caption = "Entry Number";
        entryNumberDataColumn.DataType = typeof(string);
        dataTable.Columns.Add(entryNumberDataColumn);

        var volumeDataColumn = new DataColumn();
        volumeDataColumn.ColumnName = "Volume";
        volumeDataColumn.DataType = typeof(string);
        dataTable.Columns.Add(volumeDataColumn);

        var pageDataColumn = new DataColumn();
        pageDataColumn.ColumnName = "Page";
        pageDataColumn.DataType = typeof(string);
        dataTable.Columns.Add(pageDataColumn);

        var pageCountDataColumn = new DataColumn();
        pageCountDataColumn.ColumnName = "PageCount";
        pageCountDataColumn.Caption = "Page Count";
        pageCountDataColumn.DataType = typeof(string);
        dataTable.Columns.Add(pageCountDataColumn);

        var createDateDataColumn = new DataColumn();
        createDateDataColumn.ColumnName = "CreateDate";
        createDateDataColumn.Caption = "Create Date";
        createDateDataColumn.DataType = typeof(DateTime);
        dataTable.Columns.Add(createDateDataColumn);

        foreach (var index in imgLeaseIndexes)
        {
            DataRow dataRow = dataTable.NewRow();

            dataRow["StateCode"] = index.StateCode;
            dataRow["CountyCode"] = index.CountyCode;
            dataRow["EntryNumber"] = index.EntryNumber;
            dataRow["Volume"] = index.Volume;
            dataRow["Page"] = index.Page;
            dataRow["PageCount"] = index.ImgLocation.PageCount;
            dataRow["CreateDate"] = index.ImgLocation.CreateDate;

            dataTable.Rows.Add(dataRow);
        }

        return dataTable;
    }

他に何が原因である可能性があるかについてのアイデアはありますか?

更新 2:

したがって、他の人がこの問題を抱えているようです-DataRowsの作成と設定に固有です。私の同僚はこれに出くわしました:

DataRow 値セッターが遅い!

リンク先で紹介されているものを試してみます。

4

1 に答える 1

0

チアゴがコメントで述べたように、問題は反射の使用です。

リフレクション部分は、PropertyInfoを使用している場所です。実行時にデータ型の構造を取得しています。ただし、これらはコンパイル時に認識されます。

于 2012-08-25T20:59:46.987 に答える