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

标签 c# datareader generic-list

<分区>

我在 DataReader 中有数据我想将其转换为 List<T> . 什么是可能的简单解决方案?

例如在 CustomerEntity 类中,我有 CustomerId 和 CustomerName 属性。如果我的 DataReader 将这两列作为数据返回,那么我如何将其转换为 List<CustomerEntity> .

最佳答案

我建议为此编写一个扩展方法:

public static IEnumerable<T> Select<T>(this IDataReader reader,
                                       Func<IDataReader, T> projection)
{
    while (reader.Read())
    {
        yield return projection(reader);
    }
}

然后您可以使用 LINQ 的 ToList()将其转换为 List<T> 的方法如果你愿意,像这样:

using (IDataReader reader = ...)
{
    List<Customer> customers = reader.Select(r => new Customer {
        CustomerId = r["id"] is DBNull ? null : r["id"].ToString(),
        CustomerName = r["name"] is DBNull ? null : r["name"].ToString() 
    }).ToList();
}

我实际上建议放一个 FromDataReader Customer 中的方法(或其他地方):

public static Customer FromDataReader(IDataReader reader) { ... }

那会离开:

using (IDataReader reader = ...)
{
    List<Customer> customers = reader.Select<Customer>(Customer.FromDataReader)
                                     .ToList();
}

(我认为类型推断在这种情况下不起作用,但我可能是错的...)

关于c# - 如何轻松地将 DataReader 转换为 List<T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1464883/

相关文章:

c# - 以字节为单位获取 C# 列表的大小

c# - 使用嵌套命令时是否可以避免 open DataReader 异常?

java - 在Java中创建动态类型列表

C# List<T>.BinarySearch 在找不到值时返回值

没有数据库模型的 C# 动态查询

c# - 互锁与互斥,放大问题

c# - IEnumerable 没有 Count 方法

c# - 通用关系到复合 C# 对象映射器

c# - 我们如何从 getschemaTable 中获取列大小和数据类型?

c# - 如何从通用列表中删除基于带有构造函数的类的项目?