2008-12-19 35 views
4

我试图将一个传统的C#.NET 1.1应用程序带入现代时代。我们使用DataTables来收集可能是业务对象的集合。用于将DataTable替换为集合的最佳c#泛型类?

鉴于大多数代码认为它正在与DataRow的接口进行交谈,那么泛型集合会为最不痛苦的转换做出什么?

+0

你真的需要这样做吗?如果你有一个使用数据表的工作应用程序,你正在谈论你的应用程序的重大改写。 – 2008-12-19 08:41:14

+0

我同意符文,它不像DataTable走了。如果你的应用程序运行不佳,并且你准备好进行重大改写,那么这是一个有效的问题。否则,你需要证明改变是正确的。泛型不是一个神奇的子弹。 – jcollum 2009-01-09 16:57:12

回答

7

如果我正确地阅读你的问题,你问的是哪个容器只是存储你的业务对象的列表,然后让你只需枚举集合,或通过索引选择。

好,我会考虑寻找到列表<>

,你的方法会接受任何的IList <>(访问该指数)或的IEnumerable <>(对收集使用foreach循环)

例如

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

现在我可以在使用了IEnumerable <>界面,包括列表<任何容器传递>和诺玛升阵列

例如

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

a sample n-tier app with Buiness objects

HTH

骨头

3

为什么不将DataTable和DataRow分类为适合您业务逻辑的类型,而不是改变DataSet/DataTable API?

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

+0

我同意。通常我不会再使用类型化数据集,但在这种情况下,它似乎是一个不错的选择。 – 2008-12-19 08:39:55

2

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

绝对值得调查。

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

这将为您提供EntitySet<T>,IQueryable<T>等,或者您可以使用List<T>,Collection<T>等特殊用法。

1

将“应用程序引入现代时代”的最简单方法是将代码从Visual Studio 2003升级到2005或2008。如果您正在寻找向类中添加行为(“可能是业务对象”),DataSet,DataTable和DataRow作为部分类实现的事实可以帮助您实现这一点。

上面提到的解决方案对您而言会失去很多东西,包括更改跟踪,除非您正在寻找 - 这是很大的偏差。 LINQ to SQL,Entity Framework等都提供了变更跟踪功能,但是在连接到数据库的工作单元机制中,而不是直接在你的对象上放置工作单元跟踪,就像DataRow一样。

希望你不是简单地改变你的“应用程序进入现代时代”,并且你有一些好处,你试图获得你放弃的功能和你花费的努力?

顺便说一句,这是假设你正在使用Typed DataSets ...在我看来,对于大多数用途来说,非类型化的DataSet对象是有点愚蠢的。