改进从DataRow到T的通用转换的性能

时间:2019-02-11 13:16:28

标签: c# database generics lambda

当从MSSQL数据库中查询超过1万个数据集时,我们的软件会变得非常慢(加载时间超过10秒)。我更深入地研究,发现它们通过调用接受Entity的目标类型的构造函数,实现了从DataRowT的类似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

0 个答案:

没有答案