VS 2008/ASP.NET 3.5のホームへ戻る

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構文を記述します。ここでは、抽出したレコードをGridViewDataSourceプロパティに設定して表示しています。

 

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を使用してGridViewCategoriesテーブルを表示した例

 

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()

 

VS 2008/ASP.NET 3.5のホームへ戻る