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<System.Data.DataRow>().Take(n)
そうでなければあなたが言及した方法
Midhatの答えを使用しましたが、最後にCopyToDataTable()
を追加しました。
以下のコードは、ページングをすばやく有効にするために使用した回答の拡張です。
int pageNum = 1;
int pageSize = 25;
DataTable dtPage = dt.Rows.Cast<System.Data.DataRow>().Skip((pageNum - 1) * pageSize).Take(pageSize).CopyToDataTable();
myDataTable.AsEnumerable().Take(5).CopyToDataTable()
クエリを変更できます。背後でSQL Serverを使用している場合は、そのようなニーズにSelect top n
クエリを使用できます。現在の実装は、データベースからデータ全体をフェッチします。必要な行数のみを選択すると、パフォーマンスも向上します。
データビューは、データテーブルの優れた機能です。データビューを使用して、要件ごとにデータテーブルをフィルタリングできます。関数の下は、データテーブルをリストボックスデータソースにバインドし、テキストボックスコントロールでフィルター処理した後です。 (この条件は、必要に応じて変更できます。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
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;
}