Нужно посоветовать по оптимизации инициализации списка предметов

У меня проблема с одним из моих методов, занимающим 4-5 минут для инициализации ~17 000 объектов poco и заполнения им списка. Я пытаюсь уйти от подкачки данных в запросе, поэтому требуется инициализация ~17 000. Мы используем БД Oracle и библиотеку Microsoft.Practices.EnterpriseLibrary для вызова БД. Не уверен, что эта информация актуальна, но на всякий случай. Я использую объект для чтения метода ExecuteReader, чтобы установить 60 свойств класса Poco. Я не совсем уверен, почему это занимает так много времени. Выполнение запроса занимает около 3-5 секунд. Поэтому любые советы о том, как я могу изменить свой код, чтобы ускорить процесс, будут с благодарностью. Кроме того, кто-то сказал мне, что запрос выполняется по вызову reader.Read(), а не по ExecuteReader(). Я не думаю, что это правильно, но если кто-то знает, если это так, не могли бы вы подсказать мне? Еще раз спасибо.

Класс 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;
}

0 ответов

Другие вопросы по тегам