Я трачу много времени на запрос базы данных, а затем на создание коллекций объектов из запроса. Для повышения производительности я предпочитаю использовать DataReader и код выглядит примерно так:Каков наиболее эффективный способ извлечения данных из DataReader?
while(rdr.Read()){
var myObj = new myObj();
myObj.Id = Int32.Parse(rdr["Id"].ToString();
//more populating of myObj from rdr
myObj.Created = (DateTime)rdr["Created"];
}
Для объектов, таких как DateTime
я просто бросил RDR значения требуемого класса, но это не может быть сделано для типов значений, как int
следовательно (ИМХО) трудоемкая ToString()
с последующим Int.Parse(...)
конечно, есть альтернатива:
myObj.Id = rdr.GetInt32(rdr.GetOrdinal("Id"));
который выглядит чище и не включает в себя вызов ToString()
.
коллега и я обсуждали это сегодня - он предполагает, что доступ к rdr
дважды в приведенном выше коде может быть менее эффективным, чем делать это мой старый SKOOL путь - кто-то может подтвердить или опровергнуть это, и предполагают, что из выше является best
способ делать такие вещи? Я бы особенно приветствовал ответы от @JonSkeet ;-)
Это выглядит здорово, я никогда не смотрел на GetFieldValue раньше, благодаря очень действительно :-D –
5arx
Если вы беспокоитесь о производительности, является альтернатива выше - обернуть IDataReader в DbEnumerator. DbEnumerator не очень хорошо известен и в основном предназначен для поддержки привязки данных, но он кэширует поиск имени поля в Hashtable и обеспечивает аналогичное повышение производительности выше для больших наборов результатов, сохраняя при этом код чище. – Joe