我花费大量时间查询数据库,然后从查询中构建对象的集合。为了提高性能,我倾向于使用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
这样的值类型无法做到这一点,因此(IMHO)费力的ToString()
后跟Int.Parse(...)
当然,还有另一种选择:
myObj.Id = rdr.GetInt32(rdr.GetOrdinal("Id"));
看起来更干净,并且不涉及对
ToString()
的调用。我和一位同事今天正在讨论这个问题-他建议在上述代码中两次访问
rdr
可能不如我以前的惯用方式那样有效-任何人都可以确认或否认这并建议上面哪个是best
做这种事情的方式?我特别欢迎@JonSkeet的回答;-)
最佳答案
我怀疑会有非常明显的性能差异,但是您可以通过将其从循环中移出而避免在每行进行名称查找。这可能是您将能够达到的最佳效果:
int idIdx = rdr.GetOrdinal("Id");
int createdIdx = rdr.GetOrdinal("Created");
while(rdr.Read())
{
var myObj = new myObj();
myObj.Id = rdr.GetFieldValue<int>(idIdx);
//more populating of myObj from rdr
myObj.Created = rdr.GetFieldValue<DateTime>(createdIdx);
}
关于c# - 从DataReader检索数据的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21136805/