LINQ to SQLにおける「追加」「更新」「削除」の操作とLINQ to Object
LINQはさまざまなデータソースを対象とすることができる。今回は第2回に引き続き、Visual Studioを使った開発手順や手法を解説した後、データベース以外を対象とできるLINQの機能から「LINQ to Object」「LINQ to Xml」を取り上げる。まずはLINQ to SQLにおける「追加」「更新」「削除」などのデータ操作についてみていこう。
データの「追加」「更新」「削除」
「追加」「更新」「削除」はリスト1〜3のプログラムで行うことができる。例えば更新の場合、SQL Serverに発行される実際のSQL文は、更新したい対象のリソースを照会してもロックはかけず、本当に更新が必要になった段階でロックする。
これはいわゆる「オプティミスティック同時実行制御」を考慮したものとなる(オプティミスティック同時実行制御については
「http://msdn2.microsoft.com/ja-jp/library/aa0416cz(VS.80).aspx」を参照のこと)。
リスト1:追加の例
static void Main(string[] args)
{
using(pubsDataContext pubs = new pubsDataContext())
{
job Newjob = new job();
Newjob.job_desc = "Test";
Newjob.max_lvl = 10;
Newjob.min_lvl = 10;
pubs.jobs.Add(Newjob);
pubs.SubmitChanges();
}
}
リスト2:更新の例
static void Main(string[] args)
{
using(pubsDataContext pubs = new pubsDataContext())
{
job query =(from j in pubs.jobs
where j.job_id == 12
select j).Single();
query.job_desc = query.job_desc + "_1";
pubs.SubmitChanges();
}
}
リスト3:削除の例
static void Main(string[] args)
{
using(pubsDataContext pubs = new pubsDataContext())
{
job query =(from j in pubs.jobs
where j.job_id == 12
select j).Single();
pubs.jobs.Remove(query);
pubs.SubmitChanges();
}
}
ただし、LINQ to SQLを使用したデータの「追加」「更新」「削除」は複数行を同時に操作することが不可能なため、注意しなければならない。
SQL文はどのタイミングでSQL Serverに発行されるのか?「遅延実行」
LINQをはじめてみる方は、selectなどの構文が呼ばれたタイミングでデータの取得を実施していると思われるかもしれない。しかし実際には、LINQによって取得されたデータが使用されるタイミングで、データベースに対するデータの取得が行われているのだ。つまりリスト1の「データの取得」であればforeachループの1回目であり、「追加」「更新」「削除」では、SubmitChangesを行った時点になる。
これは負荷分散のためである。LINQはデータの変形抽出を非常に柔軟に行うことができるため、実際に使用する個々のタイミングでSQLを発行することによって、オーバーヘッドを特定の場所に集中させないような考え方になっている。
例えば、アプリケーションのフォームやページなどの表示の際に使用するオブジェクトをすべて宣言しているようなコードの場合、selectなどの構文が呼ばれた時点でデータの取得を行うと、フォームやページなどの表示の際に一度に全部のSQLがデータベースに対して発行されてしまう。LINQではこうした「オブジェクト」と「データ」の間のタイミングの矛盾を上記の方法で解決しているのである。これを遅延実行や遅延評価と呼ぶ。 次のページ