C# 关于优化C代码的建议

C# 关于优化C代码的建议,c#,C#,我编写了一个通用的数据库助手方法,它返回特定实体的记录 我是这样做的: 我有一个名为Customer的类,它有10个属性,还有一个名为TableName的属性 有一个方法只接受类型参数,并返回传递类型的数组 该方法的工作原理是,通过使用反射,它获得一个表名,并触发一个select语句,然后在DataReader的基础上循环遍历每个列和传递类型的属性 所以,问题是假设有100万条记录和10个属性。它循环10个属性*1000000条记录=10000000次 有没有什么优化的方法可以做到这一点,比如对

我编写了一个通用的数据库助手方法,它返回特定实体的记录

我是这样做的:

我有一个名为Customer的类,它有10个属性,还有一个名为TableName的属性

有一个方法只接受类型参数,并返回传递类型的数组

该方法的工作原理是,通过使用反射,它获得一个表名,并触发一个select语句,然后在DataReader的基础上循环遍历每个列和传递类型的属性

所以,问题是假设有100万条记录和10个属性。它循环10个属性*1000000条记录=10000000次

有没有什么优化的方法可以做到这一点,比如对Datareader使用LINQ

这是一个密码

object[] LoadAll(Type type)
    {

        try
        {
            object obj = Activator.CreateInstance(type);
            SqlConnection conn = new SqlConnection("connection string");
            string tableName = type.GetField("TableName").GetValue(obj) as string;
            SqlCommand cmd = conn.CreateCommand();
            cmd.CommandText = string.Format("select * from {0}", tableName);
            conn.Open();
            List<object> list = new List<object>();
            SqlDataReader reader = cmd.ExecuteReader();

            while (reader.Read())
            {
                object obj1 = Activator.CreateInstance(type);
                foreach (PropertyInfo propertyInfo in type.GetProperties())
                {
                    obj.GetType().GetProperty(propertyInfo.Name).SetValue(obj1,reader[propertyInfo.Name],null);
                }

                list.Add(obj1);
            }


        }

Thanx听起来像是在计算实体每个实例的大小。您应该有一些元数据控制器,用于缓存每个表名的实体大小。假设我正确理解您的问题,对于相同的表名,大小将始终相同。

如果我正确理解了问题,听起来您可以简单地让DB为您完成工作。你说并发出一个select语句:难道你不能发出一个更聪明的select语句来完成你所解释的吗


当你说你正在循环浏览每一列时,我不完全理解你想做什么。但是查看Group by和aggrop aka AGGRAGE操作符,看看它们是否能帮助您解决问题。

尝试像NHibernate这样的对象关系映射程序。

从优化角度看,没有必要为100万条记录维护与数据库的连接,这意味着在循环结束之前,您都在与数据库交互。:。
为了优化,您将整个表记录缓存在某个数据集中,然后对其进行迭代。长时间不使用与数据库的实时连接。希望这能成为你问题的答案

您可以稍微收紧循环,以减少涉及反射的调用。您也不需要创建初始obj:

但为了更快地实现,您可以为pass LoadAll函数提供一种将行映射到新对象的方法,大致如下:

IEnumerable<T> LoadAll<T>(Func<DataReader, T> map) {
    var tablename = typeof(T).GetField("TableName)......
    // other connection and query stuff
    while (reader.Read()) {
        yield return map(reader);
    }
}
// use it like:
var kittens = LoadAll<Kitten>(reader => new Kitten {
    Name = (string)reader["Name"],
    Colour = (string)reader["Colour"]
});

这还可以让您更好地控制从数据层到域对象的映射,例如,使用反射的方法需要大量修改才能处理枚举属性,这将很容易在显式映射函数中进行编码。

您可以尝试安装,它的检查工具可以提供多种方法来从头开始优化代码

@BreakHead只是好奇,为什么要在应用程序中使用这样的类填充10Lacs记录??在这里引入一些分页机制不是更好吗?这个计算对我来说毫无意义:10个属性*10个lacs记录=10000000?因为10乘以10等于100是什么时候的事?@Tony 1=100000。Lakh是100kI的一个印度词。Ki用英语术语编辑了这个问题。
IEnumerable<T> LoadAll<T>(Func<DataReader, T> map) {
    var tablename = typeof(T).GetField("TableName)......
    // other connection and query stuff
    while (reader.Read()) {
        yield return map(reader);
    }
}
// use it like:
var kittens = LoadAll<Kitten>(reader => new Kitten {
    Name = (string)reader["Name"],
    Colour = (string)reader["Colour"]
});