.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 ログ - https://blogs.msdn.com/vbteam/archive/2008/05/13/using-linq-to-dataset-in-an-aspx-page-jonathan-aneja.aspx (英語) より
分類 : LINQ/VB9、Jonathan Aneja、Extension_Methods、Orcas、VB2008、Web