Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
最近、.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