如何从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; } 

在框架3.5中, dt.Rows.Cast().Take(n)

否则你提到的方式

我只是使用了Midhat的答案,但最后附加了CopyToDataTable()

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

 int pageNum = 1; int pageSize = 25; DataTable dtPage = dt.Rows.Cast().Skip((pageNum - 1) * pageSize).Take(pageSize).CopyToDataTable(); 
 myDataTable.AsEnumerable().Take(5).CopyToDataTable() 

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

 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; } 

如果希望行数灵活,可以在SQL中添加row_number 。 对于SQL服务器:

SELECT ROW_NUMBER() OVER (ORDER BY myOrder) ROW_NUMBER, * FROM myTable

然后过滤row_number上的数据表:

Dataview dv= new Dataview(dt, "ROW_NUMBER<=100", "", CurrentRows)

数据视图很好数据表的function。 我们可以使用数据视图按照我们的要求过滤数据表。 下面的函数是将数据表绑定到列表框数据源后,然后通过文本框控件进行过滤。 (这种情况你可以根据你的需要改变。包含(txtSearch.Text.Trim()))

 Private Sub BindClients() okcl = 0 sql = "Select * from Client Order By cname" Dim dacli As New SqlClient.SqlDataAdapter Dim cmd As New SqlClient.SqlCommand() cmd.CommandText = sql cmd.CommandType = CommandType.Text dacli.SelectCommand = cmd dacli.SelectCommand.Connection = Me.sqlcn Dim dtcli As New DataTable dacli.Fill(dtcli) dacli.Fill(dataTableClients) lstboxc.DataSource = dataTableClients lstboxc.DisplayMember = "cname" lstboxc.ValueMember = "ccode" okcl = 1 If dtcli.Rows.Count > 0 Then ccode = dtcli.Rows(0)("ccode") Call ClientDispData1() End If End Sub Private Sub FilterClients() Dim query As EnumerableRowCollection(Of DataRow) = From dataTableClients In dataTableClients.AsEnumerable() Where dataTableClients.Field(Of String) ("cname").Contains(txtSearch.Text.Trim()) Order By dataTableClients.Field(Of String)("cname") Select dataTableClients Dim dataView As DataView = query.AsDataView() lstboxc.DataSource = dataView lstboxc.DisplayMember = "cname" lstboxc.ValueMember = "ccode" okcl = 1 If dataTableClients.Rows.Count > 0 Then ccode = dataTableClients.Rows(0)("ccode") Call ClientDispData1() End If End Sub