web-dev-qa-db-ja.com

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

フレームワーク3.5では、dt.Rows.Cast<System.Data.DataRow>().Take(n)

そうでなければあなたが言及した方法

44
Midhat

Midhatの答えを使用しましたが、最後にCopyToDataTable()を追加しました。

以下のコードは、ページングをすばやく有効にするために使用した回答の拡張です。

int pageNum = 1;
int pageSize = 25;

DataTable dtPage = dt.Rows.Cast<System.Data.DataRow>().Skip((pageNum - 1) * pageSize).Take(pageSize).CopyToDataTable();
26
OldSchoolAde
myDataTable.AsEnumerable().Take(5).CopyToDataTable()
23
arij

クエリを変更できます。背後でSQL Serverを使用している場合は、そのようなニーズにSelect top nクエリを使用できます。現在の実装は、データベースからデータ全体をフェッチします。必要な行数のみを選択すると、パフォーマンスも向上します。

3
Kangkan

データビューは、データテーブルの優れた機能です。データビューを使用して、要件ごとにデータテーブルをフィルタリングできます。関数の下は、データテーブルをリストボックスデータソースにバインドし、テキストボックスコントロールでフィルター処理した後です。 (この条件は、必要に応じて変更できます。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
0
Vibindas
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;
    }
0
user2530227