DHJJ [Hatsune's Journal Japan] blog

Hatsune's Journal Japan blog

目次

Blog 利用状況

ニュース

最新ツイート

運営サイト

Hatsune's Journal Japan
DHJJ

著作など

資格など

OCP
MCP

書庫

日記カテゴリ

わんくま同盟

Linq to DataSet

わんくま同盟東京勉強会#11で、えムナウさんがLINQについて講演されていました。それに触発されて、C# 3.0にて作成されていたサンプルをVB2008に焼きなおしてみました。

まずは、RDBMSなどの特別な環境がなくても動かすところからいきたいと思いますので、第一弾としてSystem.Data.DataSetに対してLINQを提供したサンプルを移植してみましょう。ただし、そのまま移植してもつまらないので、型付Dataset「ではない」サンプルにしてみました。

Public Class WankumaLinq070801
    Private Sub Execute_Button_Click( _
                ByVal sender As System.Object, _
                ByVal e As System.EventArgs) _
                Handles Execute_Button.Click
        Dim ds As DataSet
        ds = CreateDataset()
        Dim accounts = From a In ds.Tables("Account").Rows _
                       Where a("ZipCode") = "222-3333" _
                       Select Name = a("Name"), _
                              ZipCode = a("ZipCode")
        Me.Result_Listbox.Items.Clear()
        For Each account In accounts
            Me.Result_Listbox.Items.Add( _
                account.Name & "(" & account.ZipCode & ")")
        Next
    End Sub
    Private Function CreateDataset() As DataSet
        Dim returnDs As New DataSet
        Dim row As DataRow
        returnDs.Tables.Add("Account")
        returnDs.Tables("Account").Columns.Add("Name")
        returnDs.Tables("Account").Columns.Add("ZipCode")
        returnDs.Tables("Account").Columns.Add("Prefecture")
        With returnDs.Tables("Account")
            row = .NewRow
            row("Name") = "中さん"
            row("ZipCode") = "123-4567"
            row("Prefecture") = "大阪府"
            .Rows.Add(row)
        End With
        With returnDs.Tables("Account")
            row = .NewRow
            row("Name") = "初音"
            row("ZipCode") = "222-3333"
            row("Prefecture") = "東京都"
            .Rows.Add(row)
        End With
        Return returnDs
    End Function
End Class

注目ポイントは3つあります。

  1. accountsコレクションの変数の宣言
  2. Option Strict Off
  3. accountsコレクションの利用

(1)accountsコレクションの変数の宣言

accountsコレクションの変数を宣言するところで代入文の右辺がFromから始まっています。この右辺がLINQです。

ADO.NETでSQL文を記述するときは、例えば"SELECT a.Name As Name, a.ZipCode As ZipCode FROM Account?a WHERE a.ZipCode='222-3333'”のように文字列としてCommandTextに格納する必要があるためSQL文の文法エラーは実行時まで判明しませんでした。

VS2008ではLINQはそれぞれの言語仕様の一部となっていますので、このFrom、Where、SelectなどのLINQ文もインテリセンスにより入力候補として表示されますし、綴りを間違えればコンパイルエラーとなります。

(2)Option Strict Off

以前、中さんがblogで書かれていたようにLINQを使ううえでは、Option Strict OnではなくOption Strict Offにしておく必要があります。もし、Option Strict Onでサンプルコードをコンパイルしようとすると、accountsコレクションの型の決定が実行時(遅延バインディング)となってしまいエラーとなってしまいます。

(3)accountsコレクションの利用

accountsコレクションを利用するとき、コレクションの1つ1つの要素にはLINQのSELECT句で指定した「Name」と「ZipCode」がプロパティとして公開されていて、このプロパティを使ってLINQの結果を取得することができるようになっています。

?

投稿日時 : 2007年8月5日 3:06

Feedback

# re: Linq to DataSet 2007/08/05 12:09 かるあ

すべての集合にたいしてクエリを投げられるというのはすごいけれど、なんとなく Linq to DataSet ってびみょーな感じします。
これが、型付だったら少しはいいんだけれど。。。

りクラス名の連番が気になったw

タイトル
名前
Url
コメント