Повышение производительности общего преобразования из DataRow в T - PullRequest
0 голосов
/ 11 февраля 2019

При запросе более 10 тысяч наборов данных из базы данных MSSQL наше программное обеспечение работает довольно медленно (время загрузки превышает 10 секунд).Я копнул глубже, чтобы узнать, что они реализовали некое Entity -подобное преобразование универсального объекта из DataRow в T, вызвав конструктор целевого типа, который принимает DataRow.

Это выглядит примерно так:

        List<T> filteredList = new List<T>();
        DataTable dt = ((ITableReader)typeof(T).GetMethod("GetReader").Invoke(null, new object[]{})).GetDataWhere(args);

        Type[] types = new Type[] { typeof(DataRow) };
        var constructorInfo = typeof(T).GetConstructor(types);
        var parameters = Expression.Parameter(typeof(DataRow), "dataRow");

        Func<DataRow, T> Instance = Expression.Lambda<Func<DataRow, T>>(
                                        Expression.New(constructorInfo, parameters), parameters).Compile();

        foreach (DataRow row in dt.Rows)
        {
            filteredList.Add(Instance(row));
        }

        return filteredList;

Критическая часть - это foreach, где для каждой строки вызывается конструктор целевого типа.Давайте предположим, что у меня есть более 10 тыс. Наборов данных, необходимо перебирать 10 тыс. Раз и каждый раз инициализировать объект.

Я думал о том, как улучшить это, но не могу найти решение.Похоже, что для этого требуется некоторый общий рефакторинг, избегая этого преобразования.

Поэтому мой вопрос: есть ли способ улучшить производительность в этом случае?Если нет, то что нужно сделать иначе, если я хочу List объектов из моей базы данных.Просто работайте с DataRow?

Редактировать: Другая информация, мы ограничены .NET 4.0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...