c# - 将来自数据阅读器的行转换为类型化结果

标签 c# list datareader

我正在使用返回数据读取器的第三方库。我想要一种尽可能通用的简单方法,将其转换为对象列表。
例如,假设我有一个具有 2 个属性 EmployeeId 和 Name 的类“Employee”,我希望将数据读取器(包含员工列表)转换为 List
我想我别无选择,只能遍历数据读取器的行,并将它们中的每一行转换为我将添加到列表中的 Employee 对象。有更好的解决方案吗?我使用的是 C# 3.5,理想情况下我希望它尽可能通用,以便它适用于任何类(DataReader 中的字段名称与各种对象的属性名称相匹配)。

最佳答案

您真的需要一个列表,还是 IEnumerable 就足够了?

我知道您希望它是通用的,但更常见的模式是在接受数据行(或 IDataRecord)的目标对象类型上使用静态工厂方法。这看起来像这样:

public class Employee
{
    public int Id { get; set; }
    public string Name { get; set; }

    public static Employee Create(IDataRecord record)
    {
        return new Employee
        {
           Id = record["id"],
           Name = record["name"]
        };
    }
}

.

public IEnumerable<Employee> GetEmployees()
{
    using (var reader = YourLibraryFunction())
    {
       while (reader.Read())
       {
           yield return Employee.Create(reader);
       }
    }
}

然后,如果您真的需要一个列表而不是 IEnumerable,您可以对结果调用 .ToList()。我想您也可以使用泛型 + 委托(delegate)来使此模式的代码也更易于重用。

更新:我今天又看到了这个,感觉要写通用代码了:

public IEnumerable<T> GetData<T>(IDataReader reader, Func<IDataRecord, T> BuildObject)
{
    try
    {
        while (reader.Read())
        {
            yield return BuildObject(reader);
        }
    }
    finally
    {
         reader.Dispose();
    }
}

//call it like this:
var result = GetData(YourLibraryFunction(), Employee.Create);

关于c# - 将来自数据阅读器的行转换为类型化结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1202935/

相关文章:

c# - AutoMapper 条件实体映射

c# - 如何在 ASP.NET Web API 实现中将数组传递给 OData 函数?

arrays - 属性错误: 'numpy.ndarray' object has no attribute 'toList'

string - Haskell- IO String 获取多行

c# - 来自 LINQ Query for SqlBulkCopy 的 Datareader

.net - DataReader[i] vs DataReader.GetValue(i) vs DataReader.GetString(i)

c# - 如何 : Prevent Timeout When Inspecting Unavailable Network Share - C#

c# - VB 到 C# 属性到 int 转换的转换

CSS 垂直导航栏

c# - 如何轻松地将 DataReader 转换为 List<T>?