C# 如何迭代IDataReader

C# 如何迭代IDataReader,c#,oracle,entity-framework,C#,Oracle,Entity Framework,我正在使用.Net 4.5、C、Oracle 11g和EF 4.4.0.0 现有流程 因此,我们有一个数据模型,它类似于底层数据库结构,并在应用程序中作为类创建适当的实体对象。我们并不总是使用EF加载数据,因为有时我们使用存储过程将数据加载到客户端,然后在应用程序中逐个记录实体类映射数据记录 现行守则 var dataTable = new DataTable(); var accounts = new Dictionary<Decimal, ApplicationDomain.MainV

我正在使用.Net 4.5、C、Oracle 11g和EF 4.4.0.0

现有流程

因此,我们有一个数据模型,它类似于底层数据库结构,并在应用程序中作为类创建适当的实体对象。我们并不总是使用EF加载数据,因为有时我们使用存储过程将数据加载到客户端,然后在应用程序中逐个记录实体类映射数据记录

现行守则

var dataTable = new DataTable();
var accounts = new Dictionary<Decimal, ApplicationDomain.MainView.EMPLOYEE_MASTER>();

using (var cmd = new OracleCommand("PKG_TEST.GetAllEmployees", (OracleConnection)Db.Connection))
{
    cmd.Parameters.Add(new OracleParameter("DEPT_ID", userBankId));
    cmd.Parameters.Add(new OracleParameter("EMPLOYEE_P", OracleDbType.RefCursor, 0, ParameterDirection.Output, true, 0, 0, string.Empty, DataRowVersion.Default, Convert.DBNull));
    cmd.CommandType = CommandType.StoredProcedure;

    Db.Open();
    using (IDataReader dataReader = cmd.ExecuteReader())
    {
        try
        {
            dataTable.Load(dataReader );

            foreach (BusinessObjectBuilder<ApplicationDomain.MainView.EMPLOYEE_MASTER> employeeBuilder in
                dataTable.Rows.Cast<DataRow>().Select(row => new BusinessObjectBuilder<ApplicationDomain.MainView.EMPLOYEE_MASTER>(row)).Where(
                        accountBuilder => ((IBusinessObjectBuilder<ApplicationDomain.MainView.EMPLOYEE_MASTER>)employeeBuilder).Value != null))
            {
                var employee = ((IBusinessObjectBuilder<ApplicationDomain.MainView.EMPLOYEE_MASTER>)employeeBuilder).Value;
                try
                {
                    if (!employees.ContainsValue(employee))
                    {
                        employees.Add(employee.EMPLOYEE_ID, employee);
                    }
                    else
                    {
                        _log.InfoFormat("Employee ID already exists for this Department : Employee Id{0}", employee.EMPLOYEE_ID);
                    }
                }
                catch { }
            }
        }
        finally
        {
            if (dataReader != null && !dataReader.IsClosed)
            {
                dataReader.Close();
            }
        }
    }
}
BusinessObjectBuilder类获取员工的每一行,并将其与我们在应用程序中定义的实体属性进行映射。目前,在从IDataReader加载数据后,正在对数据表的每一行执行此操作

我在找什么

我们希望摆脱DataTable从读卡器加载数据的部分。我希望直接使用BusinessObjectBuilder处理dataReader对象中的行/记录,并将其映射到相应的实体属性

如上所述,流程循环遍历datatable中的每一行,成功地将每条记录映射到实体对象并将其发送回,该实体对象将添加到字典中,并使用EMPLOYEE_ID作为键

问题

我找不到一种方法来遍历dataReader对象,获取单个记录,然后通过BusinessObjectBuilder执行正在执行的流程,将其添加到字典中,并将EMPLOYEE_ID作为键

是否有任何方法可以像使用DataTable一样迭代IDataReader实例?

使用该方法读取下一条记录,并从列中获取值:

while(dataReader.Read()) 
{
  var value1 = reader.GetValue(0); // first column
  var value2 = reader.GetValue(1); // second column
}

我会向BusinessObjectBuilder添加重载以从IDataReader读取,而不是替换DataTable方法,以备将来需要。

@D Stanley,我不想更改BusinessObjectBuilder进程。它只接受数据行,不能重载进程。我必须传递一条记录…@SaagarEliasJacky数据读取器不包含DataRow对象-如果您想要有数据行,您需要加载一个数据表。选择你的毒药。。。