【问题标题】:How to select top n rows from a datatable/dataview in ASP.NET如何从 ASP.NET 中的数据表/数据视图中选择前 n 行
【发布时间】:2010-05-07 09:18:16
【问题描述】:

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

【问题讨论】:

  • 您还在为您的查询寻找满意的答案吗?否则,您可以指出符合您期望的那个。

标签: c# asp.net ado.net


【解决方案1】:

在框架 3.5 中,dt.Rows.Cast&lt;System.Data.DataRow&gt;().Take(n)

否则你提到的方式

【讨论】:

  • 这仍然从数据库中获取所有数据。限制查询中的行数可以提高性能,同时避免不必要的数据加载和内存使用。
【解决方案2】:

我只是使用了 Midhat 的答案,但在末尾附加了CopyToDataTable()

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

int pageNum = 1;
int pageSize = 25;

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

【讨论】:

  • 如果我们将它绑定到datagridview then ,更新操作将无法正常工作。
【解决方案3】:
myDataTable.AsEnumerable().Take(5).CopyToDataTable()

【讨论】:

  • 此解决方案应该避免处理DataTable 中的所有(可能很多)行,对吗?
【解决方案4】:

您可以修改查询。如果您在后面使用 SQL Server,您可以使用Select top n 查询来满足这种需要。当前的实现从数据库中获取全部数据。仅选择所需的行数也会提高性能。

【讨论】:

    【解决方案5】:
    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;
        }
    

    【讨论】:

    • 请考虑包含一些关于您的答案的信息,而不是简单地发布代码。我们试图提供的不仅仅是“修复”,而是帮助人们学习。您应该解释原始代码中的问题、您所做的不同之处以及您的更改为何有效。
    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

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

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

      然后过滤row_number上的数据表:

      Dataview dv= new Dataview(dt, "ROW_NUMBER&lt;=100", "", CurrentRows)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-16
        • 2012-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-06
        相关资源
        最近更新 更多