我正在使用.Net 4.5,C#,Oracle 11g和EF 4.4.0.0
现有流程
因此,我们有一个类似于底层数据库结构的DataModel和在我们的应用程序中作为类创建的相应实体对象。我们并不总是使用EF来加载数据,因为有时我们使用存储过程将数据加载到客户端,然后通过记录我们应用程序中的Entity类来映射数据记录。
现有代码
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
类占用EMPLOYEE
的每一行,并将其映射到我们在应用程序中定义的Entity属性。目前,在数据表的每一行加载了IDataReader中的数据之后,这样做了。
我在寻找什么
我们希望摆脱DataTable从读取器加载数据的部分。我想直接使用BusinessObjectBuilder
来自dataReader
对象的行/记录,并将其映射到相应的实体属性。
正如您在上面所看到的,该过程循环遍历数据表中的每一行,成功地将每个记录映射到一个Entity对象并将其发回,这将被添加到Dictionary
,{{1作为关键。
问题
我无法找到迭代EMPLOYEE_ID
对象的方法,获取单个记录,然后通过dataReader
完成整个过程,并使用{{BusinessObjectBuilder
将其添加到Dictionary
1}}作为关键。
我们是否有办法以相同的方式或其他方式迭代IDataReader实例,就像我们使用DataTable一样?