最近、.aspx ファイルでの LINQ to Dataset の使用方法についてお客様から質問がありました。DataTable に対して LINQ が機能できるようにする AsEnumerable メソッドが見つからないというエラーメッセージ ("AsEnumerable は 'DataTable' のメンバではありません") がコンパイラから返されました。お客様から送られてきたコードに問題はないようです。では、コンパイラは (System.Data.DataSetExtensions.dll に定義された) 拡張メソッドをなぜ取得しないのでしょうか?

 

 

 

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Default.aspx.vb" Inherits="WebApplication6._Default" %>

 

<%@ Import Namespace="System.Linq" %>

<%@ Import Namespace="System.Data.DataSetExtensions" %>

 

<script runat="server">

 

 Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load

 

        Dim ds As New System.Data.DataSet

        ds.ReadXml(Server.MapPath("./downloads/somedatafile.xml"))

 

        'error here

        Dim query = From row In ds.Tables(0).AsEnumerable() Select row

      End Sub

 

 </script>

 

コードをしばらく調べ、コンパイラのバグであると考えた結果、ADO の担当者にコードを転送しました。この修正は簡単であることがわかりました。インポートを "System.Data.DataSetExtensions" ではなく、"System.Data" に変更すればよいのです。Reflector を開くとその理由がわかります。AsEnumerable 拡張メソッドは、System.Data.DatasetExtensions "アセンブリ" の System.Data "名前空間" に定義されています。System.Data.DatasetExtensions 名前空間もありますが、この名前空間には拡張メソッドは含まれていません。

 

私には、このように設計した理由がわかります。通常、System.Data は既にインポートされているため、System.Data に拡張メソッドを配置することにより、既存のデータセットで LINQ をすぐに使用できるようにしたのです。残念ながら、今回は該当しませんでしたが。

 

使用する正しいコード行は次のとおりです。

<%@ Import Namespace="System.Data" %>

 

余談になりますが、(VB で) LINQ to Dataset を使用するときに、実際には AsEnumerable の明示的な呼び出しを挿入する必要はありません。この理由については明日の投稿で説明します。

 

Jonathan

 

投稿 : 2008 年 5 月 13 日 午後 6 時 35 分
VB チームの Web ログ - http://blogs.msdn.com/vbteam/archive/2008/05/13/using-linq-to-dataset-in-an-aspx-page-jonathan-aneja.aspx  (英語) より

分類 : LINQ/VB9Jonathan AnejaExtension_MethodsOrcasVB2008Web