【问题标题】:Best c# generics class for replacing DataTable as collection?将 DataTable 替换为集合的最佳 C# 泛型类?
【发布时间】:2008-12-19 03:58:04
【问题描述】:

我正在尝试将旧版 C# .NET 1.1 应用程序带入现代时代。我们使用 DataTables 来收集可能是业务对象的内容。

鉴于大多数代码认为它正在与 DataRow 的接口通信,那么什么样的泛型集合才能实现最不痛苦的转换?

【问题讨论】:

  • 你真的需要这样做吗?如果您有一个使用数据表的工作应用程序,那么您正在谈论您的应用程序的重大重写。
  • 我同意 Rune 的观点,DataTable 并没有消失。如果您的应用程序运行不佳并且您已准备好进行重大重写,那么这是一个有效的问题。否则,您需要证明更改的合理性。泛型不是灵丹妙药。

标签: c# .net generics datatable


【解决方案1】:

如果我正确阅读了您的问题,您是在询问哪个容器将只存储您的业务对象列表,然后允许您仅枚举集合,或通过索引进行选择。

我会考虑查看列表

您的方法将接受 IList(访问索引)或 IEnumerable(在集合上使用 foreach 循环)

例如

private void PrintAll<T>(IEnumerable<T> items)
{
    foreach(T item in items)
        Console.WriteLine(item.ToString());
}

现在我可以传入任何使用 IEnumerable 接口的容器,包括 List 和普通数组

例子

List<Person> people = new List<Person>();
//add some people to the list
PrintAll<Person>(people);

a sample n-tier app with Buiness objects

HTH

骨头

【讨论】:

  • 我同意。此外,使用列表(或任何实现 IEnumerable 的对象)还允许使用 Linq 语法(当然,如果他正在升级到足够新的框架版本)。
【解决方案2】:

与其放弃 DataSet/DataTable API,不如将 DataTable 和 DataRow 子类化为适合您的业务逻辑的类型?

对子类 DataRow 和 DataTable 对象的支持非常出色。您将在新代码中获得所需的强类型,以及旧代码的向后兼容性。此外,您可以在任何需要/想要的地方注入业务逻辑。

【讨论】:

  • 我同意。通常我不会再使用类型化数据集,但在这种情况下,它似乎是一个不错的选择。
【解决方案3】:

如果你习惯了DataTable,想必你已经习惯了适配器(etc)带来的变化跟踪和持久性支持。在这种情况下,您是否考虑过 LINQ-to-SQL 和/或实体框架?它们都支持丰富的变更跟踪和自动持久性,同时提供各种其他 DAL 用例,例如可组合查询和所有其他 LINQ 优点。

绝对值得研究。

请注意,更改为类型化的 POCO 实体(即不是 DataRow 也不是其子类)仍然是一个很大的偏差,因此它不会是一个简单的更改。如果您没有时间进行重大更改,那么坚持使用DataTable(可能是输入的)将是务实的。

这将为您提供EntitySet&lt;T&gt;IQueryable&lt;T&gt; 等,或者您可以只使用List&lt;T&gt;Collection&lt;T&gt; 等进行临时使用。

【讨论】:

    【解决方案4】:

    将您的“应用程序带入现代时代”的最简单方法是将代码从 Visual Studio 2003 升级到 2005 或 2008。如果您希望向您的类添加行为(“可能是业务对象) ") DataSet、DataTable 和 DataRow 被实现为部分类这一事实让您明白这一点。

    上面提到的解决方案会为您丢失很多东西,包括更改跟踪,除非这正是您要寻找的东西——大幅偏离。 LINQ to SQL、实体框架等都提供更改跟踪,但在连接到数据库的工作单元机制内,而不是像 DataRow 那样将工作单元跟踪直接放在您的对象上。

    希望您不是简单地进行更改以将您的“应用程序带入现代时代”,并且您希望通过放弃的功能和付出的努力获得一些好处?

    顺便说一句,这一切都假设您使用的是类型化数据集...在我看来,对于大多数用途来说,非类型化数据集对象有点傻。

    【讨论】:

      猜你喜欢
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多