2015-11-21 120 views
1

我有一个C#应用程序在内存中有一个大的DataTable。我需要使用搜索过滤器来执行DataTable.Select以对数据进行子集合。将表中的主键添加到数据检索性能有帮助吗?是否还有其他技巧可以在子设置DataTable时获得最快的性能?C#,数据表,主键和选择性能

这就是我目前正在做的;

using (DataTable datThisProduction = datProduction.Select("IDColumn = '" + strThisID + "'", "DateColumn ASC").CopyToDataTable()) 

我需要搜索的IDColumn,然后排序DataColumn。主键是否应包含两列?

我查找了其他关于DataTable主键的帖子,如果主键有帮助,似乎还存在不确定性。

+0

更糟糕的情况是您是否将PK添加到DataTable中,并比较执行时间? –

+0

请详细介绍一下:总共有多少行? “ThisID”只有一行吗?您的数据来自哪里(RDBMS或任何其他来源/流程)? “内存中的DataTable”究竟是什么意思?你想在哪里添加PK?如果有一个RDBMS(哪个?):为什么不直接读取这一行(通过索引)? – Shnugo

+0

大量的数据。 1,000项(由ID标识),每项200+行。我将它从SQL Server读取到C#中的DataTable对象中。然后我需要提取每个项目的行。我可以从数据库中读取每个项目的数据,一次一个项目。但我试图减少到数据库的访问量。我希望处理内存中的数据比多次访问数据库要快。我找到了关于向DataTable对象添加主键的代码,其中一个DataTable被填充。我想知道这是否会加快提取每个项目的行。 – user1753352

回答

1

使用LINQ

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data; 

namespace ConsoleApplication57 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      DataTable ThisProduction = new DataTable(); 
      datThisProduction.Columns.Add("IDColumn", typeof(int)); 
      datThisProduction.Columns.Add("DataColumn", typeof(int)); 
      init strThisID = 123; 

      DataTable datThisProduction = ThisProduction.AsEnumerable() 
       .Where(x => x.Field<int>("IDColumn") == strThisID) 
       .OrderBy(y => y.Field<int>("DataColumn")) 
       .CopyToDataTable(); 

     } 
    } 
} 
+0

我会尝试这一点,并衡量性能与我第一次尝试。 – user1753352

+0

最快的方法是让数据库执行过滤。不知道你的方法是否做到这一点。我在C#代码中进行过滤。我相信最好的方法是在SQL Server数据库中编写存储过程。 – jdweng

+0

对于让数据库完成这项工作,您肯定有正确的想法。但是如果你只是读取数据,你应该更喜欢“内联UDF”。存储过程**可以用于此目的,但用于其他目的... – Shnugo

0

很简单根据您的评论你处理“大量数据”。相信我,“1000个项目”约200分项各不“大量数据” :-)

如果性能是你的问题,是别的地方这么小数据的问题...

您正在混合两个概念

说到DataTable和主键是数据库主题。这最好在你的RDBMS(你写的SQL Server)中完成。创建一个很好的结构有,实施正确的指标,你不会有任何性能问题...

人不应该尝试做内应用程序的代码数据库的工作...

多层

如果您将数据行转移到业务对象中,这是别的。有非常专业化的收藏(例如KeyedCollection),它们是为了实现这个需求而创建的。但你应该 - 为了清洁! - 在你的数据层和你的业务对象之间进行一次彻底的切割。通常情况下,我们不谈论从System.Data-namespace有对象...

可扩展性和多用户行为

在这个角度来看你的方法(加载到一切应用程序的内存和处理存在的数据)是迄今为止最严重的......

Conclusio

这取决于你的需要,如果“阅读需求数据”,或者如果有永久对象业务对象层是更好的。

你可以使用Linq轻松解决你的问题(但Linq不是快速的,它使用了Reflection),有专门的集合,甚至在你的应用程序中有一个主键 - 但这不是最好的方法。

typed datasets,EF和所有与关系有关的ORM工具中有很好的支持。在这种情况下,您的项目和您的子数据将位于1:n相关的表格中。生成的对象将具有诸如“MyParentItem”或“MyChildrenList”之类的方法。