わんくま同盟東京勉強会#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つあります。
- accountsコレクションの変数の宣言
- Option Strict Off
- 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の結果を取得することができるようになっています。
?