4

我有一个针对数据库运行的查询,我可以看到有 2013 年 5 月 31 日的记录。当我使用 ADO.NET 从 C# 运行此查询,然后使用以下代码时,我错过了 2013 年 5 月 31 日的记录

var timeSeriesList = new List<TimeSeries>();  
using (var reader = cmd.ExecuteReader())
{
    while (reader.Read())
    {
        timeSeriesList = reader.Cast<IDataRecord>()
            .Select(r => new TimeSeries
                 {
                     MidRate = (double)r["MidRate"],
                     RiskFactorName = (string)r["RiskFactorName"],
                     SeriesDate = (DateTime)r["SeriesDate"]
                 }).ToList();

    }
}

但是,如果我对这段代码使用相同的查询:

var timeSeriesList = new List<TimeSeries>();                        
using (var reader = cmd.ExecuteReader())
{
    while (reader.Read())
    {
        var timeSeries = new TimeSeries
                 {
                     MidRate = (double)reader["MidRate"],
                     RiskFactorName = (string)reader["RiskFactorName"],
                     SeriesDate = (DateTime)reader["SeriesDate"]
                 };

        timeSeriesList.Add(timeSeries);
    }
}

...那么 2013 年 5 月 31 日的记录在集合中 - 为什么第一个代码块会给出这个结果?

4

2 回答 2

8

我认为您在第一个示例中缺少记录,因为您将阅读器移动了一个然后将其转换。

试试这个改变,看看它是否有效:

var timeSeries = new List<TimeSeries>();  
using (var reader = cmd.ExecuteReader())
{
    if (reader.HasRows)
    {
        timeSeries = reader.Cast<IDataRecord>()
            .Select(r => new TimeSeries
                 {
                     MidRate = (double)r["MidRate"],
                     RiskFactorName = (string)r["RiskFactorName"],
                     SeriesDate = (DateTime)r["SeriesDate"]
                 }).ToList();
    }
}
于 2013-06-04T11:51:50.740 回答
5

有两种方法可以遍历数据读取器;一是不停地打电话.Read();另一种是将其视为and的IEnumerable序列;无论您选择哪个,您都只能迭代数据一次。IDataRecordforeach

  • 调用.Read()从 BOF 移动到第一条记录,如果有的话
    • 然后ToList()调用循环,立即向前移动一个位置GetEnumerator()(因此我们将第一条记录放在地板上而不进行处理);最后,我们浏览了所有数据MoveNext()ToList()
  • 所以外部.Read()将报告false(EOF)

基本上:这里的问题是使用两个 API 来推进职位。使用.Read()或使用foreachAPI ( .ToList())。

作为旁注,由于列名与成员名匹配,您还可以使用“dapper”来完成繁重的工作:

var list = conn.Query<TimeSeries>(sql, args).ToList();
于 2013-06-04T12:11:18.400 回答