.aspx ページでの LINQ to Dataset の使用 (Jonathan Aneja)


最近、.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


 


Comments (0)