DataTables和IEnumerable<T>的比较

28
我正在与另一位程序员辩论一个问题。对于数据库返回类型,使用DataSets和 DataTables是否会有任何显著的内存使用或性能差异,或者其他缺点应该使人们避免使用这些类型,而更喜欢实现IEnumerable的类型...反之亦然。
我更喜欢返回实现IEnumerable的类型(例如List、T[]等),因为它更轻量级,在访问属性时强类型化到对象,可以提供关于底层类型的更丰富的信息等。但是,手动使用数据读取器时设置需要更多时间。
那么,使用DataTables的唯一原因是懒惰吗?

1
我自 2009 年以来就没有再使用过 DataTable,它们很糟糕。 - CRice
使用ado.net可以通过执行“select * from table”语句来填充T[]数组吗? - Learning-Overthinker-Confused
@学习-过度思考者-困惑 是的,但您需要调用SqlCommand.ExecuteReader并通过IDataReader读取记录。 - CRice
但是 T[] 可以像带有列和值的数据表一样保存记录吗? - Learning-Overthinker-Confused
@Learning-Overthinker-Confused 是的,你可以创建一个新类,并使用属性来匹配查询结果。这样,你就可以得到一个新类型的集合作为结果,而不是 DataTable。 - CRice
显示剩余5条评论
4个回答

25

DataTables比List更加占用内存和处理器时间,使用DataReader相对于DataTables更加快速(尽管语法更繁琐,假定您使用DataAdapter来填充它们)。

话虽如此... 除非在某些需要极高性能的场合,两种方法都足够快,可以根据情况选择更为舒适的方式。(有时您需要用较少的代码填充它们,有时您需要用较少的代码读取它们)

我自己倾向于仅在将其绑定到GridView或需要同时使用多个结果集时才使用DataTables。


12
使用 System.Collections 类的另一个优点是您可以获得更好的排序和搜索选项。我不知道有什么合理的方法可以改变 DataTable 的排序或搜索方式;使用集合类,您只需实现 IComparable 或 IEquatable 接口,就可以完全自定义 List.Sort 和 List.Contains 的工作方式。
此外,使用列表时,您无需担心 DBNull,这在多个场合中让我犯了错误,因为我期望 null,但却得到了 DBNull。

4
请使用DataView进行排序和搜索。 - Concrete Gannet

11

我也喜欢使用 IEnumerable<T> 之处在于,您可以通过添加方法和属性来增强集合的基础类型,这使得实现更加优雅,代码更易于维护。例如FullName属性。如果类不受您的控制,还可以向其添加扩展方法。

public class SomeUser
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string FullName { get { return String.Format("{0} {1}", FirstName, LastName); } }
}

7

直接使用DataTables意味着将自己与底层数据源及其布局联系在一起。从可维护性的角度来看,这并不好。如果你的视图所需仅是某些对象的列表,那么你应该只提供它所需要的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接