2010-05-07 48 views
24

如何从ASP.NET中的数据表/数据视图中选择前n行?目前我正在使用下面的代码,传递表和行数来获取记录。有没有更好的办法?如何从ASP.NET中的数据表/数据视图中选择前n行

public DataTable SelectTopDataRow(DataTable dt, int count) 
{ 
    DataTable dtn = dt.Clone(); 
    for (int i = 0; i < count; i++) 
    { 
     dtn.ImportRow(dt.Rows[i]); 
    } 

    return dtn; 
} 
+2

你还在寻找适合您的查询一个满意的答案?否则,你可能会指出符合你期望的那个。 – Kangkan 2010-06-01 08:27:41

回答

34

在框架3.5,dt.Rows.Cast<System.Data.DataRow>().Take(n)

否则你提到

+0

+1很好的方式我喜欢这个 – Devjosh 2012-12-28 10:55:24

+1

这仍然从数据库中获取所有数据。限制查询中的行数可以提高性能,同时避免不必要的数据加载和内存使用。 – Kangkan 2013-04-05 12:41:29

3

的方式你可以修改查询。如果您在后面使用SQL Server,则可以使用Select top n查询来满足此类需求。当前实现从数据库中获取整个数据。只选择所需的行数也可以提高性能。

22

我刚使用了Midhat的答案,但在最后加上了CopyToDataTable()

以下代码是我用来快速启用某些分页的答案的扩展。

int pageNum = 1; 
int pageSize = 25; 

DataTable dtPage = dt.Rows.Cast<System.Data.DataRow>().Skip((pageNum - 1) * pageSize).Take(pageSize).CopyToDataTable(); 
+0

这是一个很好的分页。 – Kangkan 2013-04-05 12:42:09

+0

如果我们将此绑定到datagridview,那么更新操作将无法正常工作。 – Thunder 2014-05-07 09:37:56

18
myDataTable.AsEnumerable().Take(5).CopyToDataTable() 
0
public DataTable TopDataRow(DataTable dt, int count) 
    { 
     DataTable dtn = dt.Clone(); 
     int i = 0; 
     foreach (DataRow row in dt.Rows) 
     { 
      if (i < count) 
      { 
       dtn.ImportRow(row); 
       i++; 
      } 
      if (i > count) 
       break; 
     } 
     return dtn; 
    } 
+2

请考虑包括一些关于您的答案的信息,而不是简单地发布代码。我们尝试提供的不仅仅是“修复”,而是帮助人们学习。你应该解释原始代码中的错误,你做了什么不同,以及为什么你的改变起作用。 – 2015-01-01 00:08:29

相关问题