一尘不染

如何轻松将DataReader转换为列表?[重复]

c#

我的数据DataReader要转换为List<T>。有什么可能的简单解决方案呢?

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


阅读 300

收藏
2020-05-19

共1个答案

一尘不染

我见过使用反射和属性或字段上的属性将DataReader映射到对象的系统。(有点像什么呢LinqToSql。)他们节省一点打字和编码的DBNull等时,一旦缓存生成的代码,他们可以更快那么大多数手工编写代码,以及可减少错误的数量,所以不要
考虑 了如果您经常这样做,则是“公路”。

有关此示例,请参阅“ .NET中的反射防御”

然后,您可以编写如下代码

class CustomerDTO  
{
    [Field("id")]
    public int? CustomerId;

    [Field("name")]
    public string CustomerName;
}

using (DataReader reader = ...)
{    
   List<CustomerDTO> customers = reader.AutoMap<CustomerDTO>()
                                    .ToList();
}

(AutoMap()是扩展方法)


@Stilgar,感谢一个 伟大的 评论

如果 ,你很可能会使用更好的NHibernate,EF或LINQ到SQL等
但是在旧的项目(或其他(有时是有效的)的原因,如“非我发明”,“存储特效的爱”等)并非总是可以使用ORM,因此重量更轻的系统对于“袖手旁观”很有用。

如果您每个人也需要编写大量IDataReader循环,那么您将看到减少编码(和错误)的好处, 而不必更改正在 使用的系统 的体系结构
。这并不是说它是一个很好的体系结构。

我假设CustomerDTO不会走出数据访问层,而复合对象等将由使用DTO对象的数据访问层建立。


在我写了这个答案的几年后,Dapper进入了.NET的世界,这可能是编写onw
AutoMapper的一个很好的起点,也许它将完全消除您这样做的需要。

2020-05-19