次世代データアクセステクノロジー
第1回:LINQとADO.NET Entity Framework
著者:マイクロソフト 小高 太郎
公開日:2008/1/8(火)
ドメイン層の各パターンを補完するLINQとは?
LINQの特徴は「さまざまなデータソースのアクセスに対して、統一的なプログラミングモデルを提供する」「C#やVBの文法としてクエリーを記述することができる」「SQL構文に類似した記述ができる」がある。
図3のように、LINQが扱う対象は非常に多岐にわたり、多くの応用が可能なため、ドメイン層を構築するパターンにそのまま当てはめることは難しい。しかし、実はこの多様性を理解することで、LINQ自体の立ち位置を明確にしていくことができる。
図3:LINQプロジェクト
(画像をクリックすると別ウィンドウに拡大図を表示します)
リスト2:LINQ to SQLの例
static void Main(string[] args)
{
using (pubsDataContext pubs = new pubsDataContext())
{
var emp = from x in pubs.employees
where x.job_lvl >= 200
select new
{
x.emp_id,
x.job.job_desc,
};
foreach (var e in emp)
Console.WriteLine(e);
}
}
リスト3:数値配列に対するクエリー
var num = new int[] { 1, 2, 3, 4, 5 };
var num2 = from n in num
where n > 3
select n;
foreach (var n in num2)
Console.WriteLine(n);
LINQを解説する上で、データベースアクセスを可能にするLINQ to SQLは非常に重要な機能である。
LINQ to SQLで扱うデータソースは、SQL Serverデータベースであるが、プログラムコード自身が直接扱うものはオブジェクトだ。そのため、LINQ to SQLでデータアクセスを行う場合、事前に実テーブルとのマッピングを定義し、扱う対象のエンティティを定義する必要がある。実はこの行為は、ビジネスエンティティの設計を行うことに他ならない。つまりLINQ to SQLは、ドメインモデルとしての使用も前提にあるといえるだろう。
LINQ to SQLでの事前のマッピングファイルは、Entity Data Modelほど多才な表現はできないが、その分アジャイルなモデリングを可能とする。またLINQは、前述のEntity Data Model自体を対象にすることもできる(LINQ to Entity)。
さらに、LINQで扱うことのできる対象として、非接続型のデータセットをあげておきたい。ADO.NETが提供するデータセット自体は、いわばインメモリのデータベースである。従来、.NET Frameworkでは、データセットの取得はできても、取得したデータセットに対して、さらなるクエリーを行うことは難しかった。ところが、LINQではこのデータセットをデータソースとして扱えるため、LINQを使用した2次加工が可能なのだ。
これにより従来の.NET Frameworkによるテーブルモジュールパターンが苦手とする処理をLINQが補完できる。当然ながら、LINQがトランザクションスクリプトの内部で使用できることは想像に難くない。
LINQは、その言語文法の見た目から、一見データベースアクセスの機能のみに目がいってしまいがちであるが、メモリ内のコレクションオブジェクト、XMLデータなど、異なるデータソースに対しての統一的なクエリーが可能な点にも注目して欲しい。例えばリスト3のプログラムは、数値配列に対するクエリーである。
このようにLINQは、ビジネスロジック内部でコレクションオブジェクトが発生する一般的な処理の中でも充分に活用できる。
すなわちLINQを活用することで、リレーショナルデータベースそのものは勿論、もう1つ上のEntity Data Model、さらにはADO.NETにより取得されたインメモリのデータセット、メモリ内の一般的なコレクション(変数)も含め、あらゆるデータソースに対して統一的なデータアクセスを提供することで、ドメインロジックの各パターンを補完できるのである。
さて、次回はLINQの具体的な実装について解説していこう。