这个问题在这里已经有了答案:





Improve data access layer select method Pattern

(7 个回答)



Convert rows from a data reader into typed results

(10 个回答)


8年前关闭。




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

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

最佳答案

我见过使用反射和属性或字段上的属性将 DataReader 映射到对象的系统。 (有点像 LinqToSql 所做的。)它们节省了一些打字的时间,并且在为 DBNull 等编码时可能会减少错误的数量。一旦你缓存了生成的代码,它们也可以比大多数手写代码更快,所以一定要考虑如果您经常这样做,则为“高速公路”。

请参阅 "A Defense of Reflection in .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 or Linq to Sql, etc 但是在旧项目上(或出于其他(有时是有效的)原因,例如“不在这里发明”,“喜欢存储过程”等)并不总是可能的使用 ORM,因此重量较轻的系统对于“袖手旁观”很有用

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

我假设 CustomerDTO 不会脱离数据访问层,复合对象等将由数据访问层使用 DTO 对象构建。

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

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

10-12 22:09