如何在ASP.NET中从DataTable/DataView中选择前n行

41

如何从ASP.NET的datatable/dataview中选择前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
7个回答

53

在3.5框架中,dt.Rows.Cast<System.Data.DataRow>().Take(n)表示获取数据表前n行。

否则,你提到的方法是什么?


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

36

我刚刚使用了Midhat的答案,但在末尾添加了CopyToDataTable()

下面的代码是对我使用的答案进行扩展,以便快速启用某些分页功能。

int pageNum = 1;
int pageSize = 25;

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

如果我们将其绑定到DataGridView,那么更新操作将无法正常工作。 - Thunder

33
myDataTable.AsEnumerable().Take(5).CopyToDataTable()

这个解决方案应该避免处理DataTable中的所有(可能很多)行,对吗? - Nicolas

3

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


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
请考虑在您的答案中包含一些信息,而不仅仅是发布代码。我们试图提供的不仅仅是“修复”,而是帮助人们学习。您应该解释原始代码中出了什么问题,您做了什么不同的事情以及为什么您的更改有效。 - Andrew Barber

0

数据视图是数据表格的良好功能。我们可以使用数据视图根据需求过滤数据表格。下面的函数是在将数据表格绑定到列表框数据源之后,通过文本框控件进行筛选。 (您可以根据需要更改此条件。包含(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

-1
如果您想要行数具有灵活性,可以在 SQL 中添加 row_number。对于 SQL Server: SELECT ROW_NUMBER() OVER (ORDER BY myOrder) ROW_NUMBER, * FROM myTable 然后在 row_number 上过滤数据表: Dataview dv= new Dataview(dt, "ROW_NUMBER<=100", "", CurrentRows)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接