При запросе более 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