Нужно посоветовать по оптимизации инициализации списка предметов
У меня проблема с одним из моих методов, занимающим 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;
}