0

LINQ の Take を介して DataTable に特定の数の行を返すか、Rows プロパティでそれを使用したいだけですが、それを行う方法や場所がわかりません: 現在のコードは次のとおりです。

 Dim dt As DataTable = GetDataTable("sp", params)
 For Each dr As DataRow In dt.Rows
        Dim o As New OR()
        o.P = p
        o.Id = dr ("A")
        o.R = dr ("B")
 Next

それは次のようなものでしょうか:

Dim dt As DataTable = GetDataTable("sp", params).AsEnumerable().Take(10)

上記を実行すると、次のエラーが表示されます。

The 'TakeIterator' start tag on line 4 position 60 does not match the end tag of 'Error'. Line 4, position 137.

Unable to cast object of type '<TakeIterator>d__3a1[System.Data.DataRow]' を 'System.Data.DataTable' と入力します。

4

1 に答える 1

1

必要な場合DataTable:

Dim dt As DataTable = (From row in GetDataTable("sp", params) Take 10).CopyToDataTable()

が必要な場合(はキーワードであるList(Of [Or])ため、括弧が必要です)Or

Dim list As List(Of [Or]) = (From row In GetDataTable("sp", params)
                            Select New [Or]() {
                                o.Id = row.Field(Of Int32)("Id"),
                                o.R =  row.Field(Of String)("R")
                            }).Take(10).ToList()

編集

Take に Where を含める方法はありますか。たとえば、テーブルに 3 つのステータス、Open、Semi-Open、Closed があります。Take 10 だけを Open に使用したいのですが、Semi-Open を終了したいです。そして一人で閉店。例として、セミオープンとクローズドには 5 つのレコードがあり、オープンから 10 を取得するため、合計 15 行になります。

はい、方法があります:

Dim dt =  GetDataTable("sp", params)
Dim open10 = From row In dt
             Where row.Field(Of String)("Status") = "Open"
             Take 10
Dim rest = From row In dt
           Where row.Field(Of String)("Status") <> "Open"
Dim tblResult = open10.Concat(rest).CopyToDataTable()
于 2012-06-05T20:45:14.407 に答える