VB における LINQ to Dataset の機能 (Jonathan Aneja)
根本的に、LINQ ではクエリ可能なデータ ソースが必要です。つまり、基本的にデータ ソースは IEnumerable を実装している必要があります (実際にはもう少し複雑です。詳細については、Visual Basic 言語仕様のセクション 11.21.2 をご覧ください)。LINQ to Dataset を使用する場合、1 つ問題があります。DataTable は IEnumerable を実装していないため、DataTable に対してどのようにクエリを実行すればよいかということです。
昨日説明したように、Visual Studio 2008 には AsEnumerable() という拡張メソッドを定義した System.Data.DataSetExtensions.dll というアセンブリが用意されています。このメソッドは、次のようになります。
<Extension()> _
Public Function AsEnumerable(source As DataTable) As EnumerableRowCollection(Of DataRow)
基本的に、このメソッドは DataTable を取得し、IEnumerable(Of T) を実装しているものを返します。LINQ は標準クエリ演算子によってこれを利用できます。そのため、必要な操作は System.Data をインポートすることだけです (プロジェクト テンプレートでは既定で実行されます)。System.Data をインポートしたら、AsEnumerable() を呼び出すことにより、データセットに対して LINQ を使用できるようになります。
Dim customers = TestDS.Tables("Customers")
Dim franceCustomers = From cust In customers.AsEnumerable() _
Where cust!Country = "France" _
Select cust
VB で LINQ を機能させる方法について興味深い点の 1 つは、実際にはコンパイルするために上記のコードの AsEnumerable() を明示的に呼び出す必要はないことです。DataTable が IEnumerable を実装していなくても、コンパイラが DataTable をクエリ可能なものに変換できるメソッドを探すことによってこの部分を支援します。VB コンパイラは、IEnumerable、IEnumerable(Of T)、IQueryable、または IQueryable(Of T) を実装していない型に対する LINQ クエリを検出すると、次の処理を順次実行します。
1. 型で使用可能な一致する Select メソッドがあるかどうかを確認します。
2. クエリ可能な型を返す AsQueryable というインスタンス メソッドが型に含まれているかどうかを確認します。
3. クエリ可能な型を返す AsQueryable という拡張メソッドが型のスコープ内に含まれているかどうかを確認します。
4. クエリ可能な型を返す AsEnumerable というインスタンス メソッドが型に含まれているかどうかを確認します。
5. クエリ可能な型を返す AsEnumerable という拡張メソッドが型のスコープ内に含まれているかどうかを確認します。
コンパイラは、いずれかの時点で一致するメソッドを見つけると、そのメソッドの呼び出しを挿入します。System.Data 名前空間をインポートしている場合、コンパイラは手順 5. で DataTable を調べて一致するものを見つけ、AsEnumerable の呼び出しを挿入します。したがって、101 LINQ サンプル (英語) の次の例のような LINQ to Dataset コードを作成すればよいことになります。
Dim customers = TestDS.Tables("Customers")
Dim franceCustomers = From cust In customers _
Where cust!Country = "France" _
Select cust
クエリ可能なものを返す AsEnumerable 拡張メソッドを使用することにより、型を LINQ 対応にすることができるというわけです。
厳密に型指定されたデータセットの場合、IEnumerable を実装する TypedTableBase(Of T) から継承されるため、AsEnumerable を呼び出す必要はありません。これは VS2008 の新しい型です。VS2005 では、データセット デザイナによって、DataTable から継承され、IEnumerable 自体を明示的に実装したコードが生成されます。
投稿 : 2008 年 5 月 14 日 午後 4 時 52 分
VB チームの Web ログ - https://blogs.msdn.com/vbteam/archive/2008/05/14/how-linq-to-dataset-works-in-vb-jonathan-aneja.aspx (英語) より
分類 : LINQ/VB9、Data_Design、Jonathan Aneja、Extension_Methods、VB2005、Orcas、VB2008、VS2005