更好的DataTable

时间:2008-12-17 19:40:50

标签: c# linq

我有一个使用DataTables执行数据分组,过滤和聚合的应用程序。我想用我自己的数据结构替换数据表,因此我们没有任何不必要的开销,我们从使用数据表。所以我的问题是,如果Linq可以用来执行我的数据的分组,过滤和聚合,如果它的性能可以与数据表相媲美,还是我应该蹲下来编写我自己的算法呢?

由于

Dan R。

4 个答案:

答案 0 :(得分:2)

除非你选择简单的类(POCO等),否则你自己的实现可能会有与DataTable几乎相同的开销。就个人而言,我更多地使用LINQ-to-SQL,Entity Framework等工具。然后,您可以使用针对本地数据的LINQ-to-Objects,或针对复杂数据库查询使用特定于提供程序的实现,而无需全部使用数据给客户。

LINQ-to-Objects可以执行你提到的所有事情,但它涉及将所有数据都存储在内存中。如果您有非平凡的数据,建议使用数据库。如果你看一下LINQ-to-SQL或Entity Framework,SQL Server Express Edition将是一个很好的起点。


编辑评论:

常规的TSQL命令很好用,但是你要问的是差异......最大的问题是LINQ-to-SQL将为你提供整个DAL,这是一个巨大的节省时间,并使其成为可能获得更多的编译时安全性。但是也允许您使用相同的方法查看本地对象和数据库 - 例如,以下是有效的C#3.0([someDataSource]除外,见下文):

var qry = from row in [someDataSource]
          group row by row.Category into grp
          select new {Category = grp.Key, Count = grp.Count(),
              TotalValue = grp.Sum(x=>x.Value) };

foreach(var x in qry) {
    Console.WriteLine("{0}, {1}, {2}", x.Category, x.Count, x.TotalValue);
}

如果[someDataSource]是本地数据,例如List<T>,则会在本地执行;但如果这是来自您的LINQ-to-SQL数据上下文,它可以在数据库服务器上构建适当的TSQL。这样就可以在代码中使用单个查询机制(当然,在LOLA的范围内)。

答案 1 :(得分:1)

最好让数据库处理分组,过滤和聚合。 DataTables在这种情况下实际上相对较好(它们的不良声誉似乎主要来自不恰当的使用),但不如实际的数据库好。此外,如果没有很多的工作,我会把钱花在DataTable上,而不是你自己开发的数据结构。

答案 2 :(得分:0)

为什么不使用像Sqlserver CE或firebird embedded这样的本地数据库? (甚至ms访问!:))。将数据存储在本地数据库中,使用简单的SQL查询进行处理并将数据拉回。更简单,可能更少的开销,而且您不必为分组/聚合等编写所有逻辑,因为数据库系统已经具有内置,调试和工作的逻辑。

答案 3 :(得分:0)

是的,您可以使用LINQ使用自定义对象执行所有这些操作。

我注意到很多人建议您在数据库中执行此类操作...但您从未说明数据库的来源。

如果数据 来自数据库,则至少应该在那里进行过滤,除非您正在做一些专门的事情(例如,使用缓存的数据集)。即便如此,如果您正在处理大量缓存数据,您可能会将这些数据放入像SQLite这样的嵌入式数据库中,就像其他人已经提到的那样。