2

datatable.Select(Name Like '#%#') を実行しようとしているデータテーブルがありますが、無効なパターンというエラーが発生します (#Mike#、#Brow# を持つ名前 col のテーブルの結果を期待しています)。すべてのアイテムのディントにエスケープ シーケンスのディントを使用しても問題なく動作します。多くの人がLinqを使用することを提案していますが、Linqは初めてです。このデータテーブルからLinqでこのフィルターを実行するにはどうすればよいですか。

これは私がやろうとしていたことのサンプルです..

 Dim dtSamp As Data.DataTable
    dtSamp = New Data.DataTable
    dtSamp.Columns.Add("Name")
    dtSamp.Columns.Add("Marks")

    Dim dr As DataRow
    dr = dtSamp.NewRow()
    dr.Item(0) = "AAA"
    dr.Item(1) = "50"
    dtSamp.Rows.Add(dr)
    dr = dtSamp.NewRow()
    dr.Item(0) = "#bbb#"
    dr.Item(1) = "60"
    dtSamp.Rows.Add(dr)
    dr = dtSamp.NewRow()
    dr.Item(0) = "ccc"
    dr.Item(1) = "44"
    dtSamp.Rows.Add(dr)

    Dim drResult As DataRow()
    drResult = dtSamp.Select("Name Like '#%#'")

    Dim dtOutPutTable As Data.DataTable
    dtOutPutTable = drResult.CopyToDataTable()

dtOutPutTable では、1 行、つまり #bbb# が期待されていましたが、Select 関数は失敗します。

4

2 に答える 2

3

通常、LINQクエリは、を実装するデータソースで機能しますIEnumerable<T>/ IQueryable<T> Interface。ただし、DataTableはこれらのいずれも実装していません。そのため、DataTableにLINQクエリを直接適用することはできません。

ただし、DataTableクラスには、 DataRowのコレクションAsEnumerableを返すという拡張メソッドがあります。そのため、DataTableに関数をIEnumerable適用してから、結果のコレクションでLINQを試すことができます。AsEnumerable

var items=(from p in myDataTable.AsEnumerable()
                 select new { ID= p.Field<int>("ID").
                              Name=p.Field<string>("Name")
                           }).ToList();
var filtered=items.Where(x => x.Name.Contains("Mike"));

編集:これがVB.NETバージョンです(免責事項:私はVB.NETの人ではありませんが、エラーなしでこのコードをビルドできます)

Dim items = (From p In myDataTable.AsEnumerable() 
               Select New With {.ID = p.Field(Of Integer)("ID"),
                                .Name = p.Field(Of String)("Name")}).ToList()

Dim filtered = items.Where(Function(x) x.Name.Contains("Mike")).ToList()
于 2012-09-05T21:11:00.403 に答える