技術日記
技術調査記録Edit

LINQ to SQL: リレーショナル データのための .NET 統合言語クエリ

前回、MySQL with tritonnに対して、LINQを使わず直接SQL文で全文検索を行った結果を、ページネーション用情報管理クラスに渡したところ、「クエリの結果を複数回列挙することはできません。」例外が発生したところからの続き。

結局RDBでLINQを使うときの詳しい仕様を把握しておかなければだめなんだねということで、上記もマイクロソフト公式ドキュメントをちゃんと読んでみることにする。

序盤に出てくるサンプルコードの、

[sourcecode language="c#"]
// DataContext で接続文字列を取得します。
DataContext db = new   DataContext("c:\northwind\northwnd.mdf");
[/sourcecode]
の部分って、コメントは「DataContext 接続文字列で取得します。」だよね。ずいぶん古いドキュメントっぽいけど、なんで直ってないんだろう。

で、なるほどサーバーエクスプローラを使ってDB接続して自動生成したクラスは、このDataContextってやつなのねとソースを見てみたら、なんか自動生成されたクラスの親クラスはDataContextじゃなくてObjectCotextになってるぞ。

ヘルプを見ると、DataContextクラスは「LINQ to SQL フレームワークのメイン エントリ ポイントを表します。」になっていて、ObjectContextクラスは「エンティティ データをオブジェクトとして、クエリや操作を実行するための機能を提供します。」になっている。

名前空間の階層で見ると、DataContextはLINQの機能で、ObjectContextはより上位概念であるEntity Data Modelの機能なのかな? とマイクロソフト用語を並べると理解した気になるけれども、LINQとかEntity Data Modelとかの意味(全体像)がわかってないので、そんなまとめ方に何の意味もありませんが、なにか?

機能としてはどっちもORM的なものを提供するための機能っぽいんだけど、どういう違いがあるのかまとめた説明はないのか?

LINQによるデータベース・アクセスとO/Rマッピング - @IT」を読むと、

  • VS2008世代のO/Rデザイナツールを利用して作るのが.dbmlファイル
  • これで自動生成されるクラスが、下記の二つ。
    • DataContextクラスを継承したエンティティクラス=テーブル定義と対応したクラス
    • DB接続やらSQL文の発行、エンティティクラスの生成や管理(ファクタリーっぽい?)を行うのがDataContextクラス
つまり、VS2008世代のO/Rマッピングは、DBレイヤーの処理を担当するDataContextクラスがあり、その下に具体的なテーブルとマッピングされるエンティティクラス群が存在する、という形。

というあたりで、やっぱりLINQに関してもっと基本的な部分を理解しておこうと、「LINQ(リンク)の基礎知識 - @IT」も読んでおくことにする。

  • クエリの戻り値はIEnumerable<T>オブジェクト
  • クエリが実行されるのは、クエリの結果がforeach文により処理されるとき(遅延実行)
  • クエリ結果に対してToArrayメソッドあるいはToListメソッドを呼び出せば、クエリが即時実行される
  • 通常のLINQクエリーを、等価のメソッド呼び出しに変換できる。from n in data where n.ShipCountry == "Norway" select n → data.Where(n => n.ShipCountry == "Norway").Select(n => n)
  • n => n.ShipCounter == "Norway" は、delegate(Orders n) {return n.ShipCountry == "Norway";}相当のラムダ式
  • 結果セットのカラムを絞りたい場合は、var records = from n in data where n.ShipCountry == "Norway" select new { OrderID = n.OrderID, EmployeeID = n.EmployeeID }; のように匿名クラスを使う。匿名クラスはクラス名がないのでvarで受け取る。
  • LINQクエリーをメソッド呼び出しに変換する際に使用したwhereやselectは拡張メソッド
LINQおよびDataContextについては、何となくわかってきた。

続いて、「第1回 最新DBアクセス・フレームワークの基本的な考え方 - @IT」でADO.NET Entity Frameworkについて学んでみる。

  • .NET Framework 3.5以降に搭載。.NET Framework 4で大幅に拡張
  • EDMはただのO/Rマッパーとは違う的な話をしてるけど、結局O/Rマッパーだよね
  • EDM(Entity Data Model) = CSDL(Conceptual Schema Definition Language: 概念スキーマ定義言語) + MSL(Mapping Schema Language) + SSDL(Storage Schema Definition Language) らしいが、なんかもう独自技術をてんこ盛りしすぎて理解する気になれないな
  • SSDL → MSL → CSDL という順序にRDBに近い側から抽象概念に近い側によってくるらしい。実際のRDBの実装を、3段階のレイヤーで抽象化しつつ、このEntity Data Modelという実装にマッチングさせているんだろうなー。
  • EDMの場合は、LINQではなく、Entity SQLとかObject SQLとか、SQLレベルで取り扱うのか? 最終的にはLINQにつなぎ込むみたいだけど、プログラマが直接扱うレイヤーとして、LINQの前にEDM専用のEntity SQLとかObject SQLとかいうレイヤーがあるらしい
というところまでで時間切れで今日はおしまい。

Published At2011-10-31 17:48Updated At2011-10-31 17:48