◆LINQへの対応
.NET Framework 3.5では、LINQ(Language Integrated Query)が追加されました。LINQを利用するとVisual Basicなどの言語から直接SQL構文を入力してSQL Serverのデータベースをアクセスすることができます。Visual Basicなどの開発言語から直接SQL構文を入力できるため、コンパイル時に構文のエラーチェックができる、インテリセンス機能が利用できるといったメリットがあります。
LINQを利用するには、VS 2008の「新しい項目の追加」ダイアログのテンプレートから「LINQ to SQLクラス」を選択してDBML(Database Mapping Language)ファイルを作成します
図 テンプレートから「LINQ to SQLクラス」を選択する
オブジェクトリレーショナルデザイナが表示されたら、サーバーエクスプローラからNwindSQL.mdfデータベースを展開してテーブルを表示します。サーバーエクスプローラからテーブルをドラッグ&ドロップするとテーブルのエンティティクラスが自動生成されます。たとえば、Categoriesテーブルをドラッグ&ドロップするとCategoriesのエンティティクラスが生成されます。エンティティクラスの名前を変更するにはデザイナから「Categories」をダブルクリックして「Category」のように書き換えます。Categoriesクラスのソースコードは「App_Code」フォルダの「NwindSQL.designer.vb」に格納されます。
図 サーバーエクスプローラから「Categories」テーブルをドラッグ&ドロップする
LINQ to SQLクラスを使用してテーブルのレコードを抽出するには、NwindSQLDataContextのインスタンスを生成します。次に、Categoriesテーブルからレコードを抽出するSQL構文を記述します。ここでは、抽出したレコードをGridViewのDataSourceプロパティに設定して表示しています。
Protected Sub ShowCategories()
Dim db As New NwindSQLDataContext
Dim categories = From c In db.Category _
Order By c.CategoryID Descending _
Select c.CategoryID, c.CategoryName
GridView1.DataSource = categories
GridView1.DataBind()
End Sub
図 LINQを使用してGridViewにCategoriesテーブルを表示した例
Categoriesテーブルからすべての列を抽出するには次のように記述します。レコードを絞り込むにはWhereを追加します。CategoryNameで絞り込むときは、CategoryName.StartWith("XXX")、CategoryName.EndsWith("XXX")、CategoryName.Contains("XXX")のように記述することもできます。
‘ すべてのレコードを抽出
Dim categories = From c In db.Category _
Select c
‘ レコードを絞り込む
Dim categories = From c In db.Category _
Where c.CategoryID = 1 _
Select c
Categoriesテーブルから特定のレコードを抽出するには、Skip()、Take()メソッドを使用します。この例は、Categoriesテーブルの先頭から2レコードスキップして3番目のレコードから3件抽出して表示します。
‘ レコードをスキップ
Dim categories = From c In db.Category _
Select c
GridView1.DataSource = category.Skip(2).Take(3)
GridView1.DataBind()
このほか、商品別の受注件数や売上高を計算するといったこともできます。
Dim db As New NwindSQLDataContext
Dim product = From p In db.Product _
Select p.ProductID, _
p.ProductName, _
NumOfOrders = p.OrderDetail.Count, _
Revenue = Aggregate detail In p.OrderDetail _
Into Sum(detail.UnitPrice * detail.Quantity)
GridView1.DataSource = product.Take(5)
GridView1.DataBind()
図 商品別受注件数と売上高を計算して表示した例
Categoriesテーブルに新規レコードを追加するには、InsertOnSubmit()メソッドを実行します。レコードを更新するには、列の値を書き換えてからSubmitChanges()メソッドを実行します。レコードを削除するには目的のレコードを抽出してからDeleteOnSubmit()メソッドを実行します。追加、更新、削除したレコードをデータベースに反映させるにはSubmitChanges()メソッドを実行します。
' レコードの追加
Dim db As New NwindSQLDataContext
Dim c As New Category With {.CategoryName = "ASP.NET 3.5"}
db.Categories.InsertOnSubmit(c)
db.SubmitChanges()
' レコードの更新
Dim db As New NwindSQLDataContext
Dim c1 = (From c In db.Category _
Where c.CategoryName.StartsWith("ASP.NET 3.5") _
Select c).Single
c1.CategoryName = "ASP.NET 2.0"
db.SubmitChanges()
' レコードの削除
Dim db As New NwindSQLDataContext
Dim c1 = (From c In db.Category _
Where c.CategoryName.StartsWith("ASP.NET 2.0") _
Select c).Single
db.Category.DeleteOnSubmit(c1)
db.SubmitChanges()