2

だから、私はデータベース上にあるアプリケーションを持っています。これまでのところ、クエリの結果はすべて次のような DataTable オブジェクトになりました。

DataTable data = new DataTable();
data.Load(someQuery.ExecuteReader());

ここで、データを厳密に型指定されたオブジェクトのリストにロードしたいと考えています。このようなもの:

List<MyClass> data = someQuery.Load<MyClass>();

ただし、そのメソッドを最初に作成したときは、DataTable.Load(IDataReader) メソッドよりも実行速度がほぼ 3 倍遅くなりました。基本的に、ユーザー GetConstructor(null).Invoke(null) を作成してオブジェクトを作成し、 PropertyInfo.SetValue(reader.GetValue()) を使用してデータを入力しました。

これを行うより良い方法はありますか?

使用した方法:

    public List<T> LoadData<T>(DbCommand query)
    {
        Type t = typeof(T);

        List<T> list = new List<T>();
        using (IDataReader reader = query.ExecuteReader())
        {
            while (reader.Read())
            {
                T newObject = (T)t.GetConstructor(null).Invoke(null);

                for (int ct = 0; ct < reader.FieldCount; ct++)
                {
                    PropertyInfo prop = t.GetProperty(reader.GetName(ct));
                    if (prop != null)
                        prop.SetValue(newObject, reader.GetValue(ct), null);
                }

                list.Add(newObject);
            }
        }

        return list;
    }
4

2 に答える 2

0

linQ を使用してクエリを実行し、ジェネリック リストを取得してから、それを DataTable に変換する場合は、次のコードを使用すると役立つ場合があります。

public DataTable ListToDataTable<T>(IEnumerable<T> list)
    {
        PropertyDescriptorCollection properties =
            TypeDescriptor.GetProperties(typeof(T));
        DataTable table = new DataTable();
        foreach (PropertyDescriptor prop in properties)
            table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
        foreach (T item in list)
        {
            DataRow row = table.NewRow();
            foreach (PropertyDescriptor prop in properties)
                row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
            table.Rows.Add(row);
        }
        return table;
    }

厳密に型指定されたクラスで機能します。実行にかかる時間を確認してください。

ありがとう、

于 2013-09-21T07:14:48.300 に答える