如何从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;
}
答案 0 :(得分:43)
在框架3.5中,dt.Rows.Cast<System.Data.DataRow>().Take(n)
否则你提到的方式
答案 1 :(得分:26)
我刚刚使用了Midhat的答案,但最后添加了CopyToDataTable()
。
下面的代码是我用来快速启用一些分页的答案的扩展。
int pageNum = 1;
int pageSize = 25;
DataTable dtPage = dt.Rows.Cast<System.Data.DataRow>().Skip((pageNum - 1) * pageSize).Take(pageSize).CopyToDataTable();
答案 2 :(得分:22)
myDataTable.AsEnumerable().Take(5).CopyToDataTable()
答案 3 :(得分:3)
您可以修改查询。如果您在后面使用SQL Server,则可以使用Select top n
查询来满足此类需求。当前实现从数据库中获取整个数据。仅选择所需的行数也可以提高性能。
答案 4 :(得分: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;
}
答案 5 :(得分:0)
如果希望行数灵活,可以在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)
答案 6 :(得分: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