0

17,000 個の poco オブジェクトを初期化し、それらをリストに入力するのに 4 ~ 5 分かかるメソッドの 1 つに問題があります。クエリでデータのページングを回避しようとしているため、〜 17,000 を初期化する必要があります。Oracle DB と Microsoft.Practices.EnterpriseLibrary を使用して DB を呼び出しています。その情報が関連しているかどうかはわかりませんが、念のため。ExecuteReader メソッドのリーダー オブジェクトを使用して、Poco クラスの 60 個のプロパティを設定しています。なぜこんなに時間がかかるのか、よくわかりません。クエリの実行には約 3 ~ 5 秒かかります。したがって、コードを変更して速度を上げる方法についてのアドバイスは大歓迎です。また、クエリは ExecuteReader() 呼び出しではなく、reader.Read() 呼び出しで実行されると誰かが私に言いました。私はそれが正しいとは思いませんが、誰かが知っていれば」もしそうなら、あなたは私に手がかりを与えることができますか?再度、感謝します。

POCOクラス

public class BaseWorkItem : ITransactionWorkItem  
{  
    public int Prop1 { get; set; }  
    public string Prop2 { get; set; }
    ....  

    public ITransactionWorkItem SetValues(IDataReader reader)
    {
        Prop1 = reader["Prop1"] != DBNull.Value ?
            Convert.ToInt32(reader["Prop1"]) : -1;
        Prop2 = reader["Prop2"] != DBNull.Value ?
            reader["Prop2"].ToString() : "";  
        ....  
        return this;
    }
}

DataAccess と初期化メソッド

static IEnumerable<ITransactionWorkItem> GetQueue_WorkItems<T>(IDataReader reader)
    where T : ITransactionWorkItem, new()
{
    if (reader.IsNotNull())
    {
        while (reader.Read())
        {
            yield return (T)(new T().SetValues(reader));
        }
    }
}

public static List<ITransactionWorkItem> GetItems(int param1, int param2,
    int param3, int param4)
{
    Database oracle = null;
    IDataReader reader = null;
    var items = new List<ITransactionWorkItem>();

    oracle = Oracle.GetDatabase();

    using (reader = oracle.ExecuteReader("SomeProcedureName", param1, param2,
        param3, param4, null))
    {
        items.AddRange(GetQueue_WorkItems<BaseWorkItem>(reader));
    }

    return items;
}
4

0 に答える 0