当从MSSQL
数据库中查询超过1万个数据集时,我们的软件会变得非常慢(加载时间超过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
,其中每一行都调用目标类型的构造器。假设我有超过10k的数据集,它需要迭代10k次并每次都初始化对象。
我当时正在考虑如何改善这一点,但我找不到真正的解决方案。似乎需要通过避免这种转换来进行一些常规重构。
因此,我的问题是,在这种情况下,是否有任何方法可以改善性能?如果没有,如果我要从数据库中获取List
个对象,应该怎么做。可以和DataRow
一起使用吗?
编辑:另一个信息,我们仅限于.NET 4.0