※この投稿はMicrosoft Visual Studio 2008 Beta2で動作を確認しています。
複数のデータを削除するには、対象となるデータを抽出し、その結果をRemoveAllメソッドに渡します。
たとえば以下のようなプログラムになります。
using System;
using System.Linq;
namespace LINQ7
{
class Program
{
static void Main(string[] args)
{
LINQTESTDataContext dtc = new LINQTESTDataContext();
dtc.Log = Console.Out;
var query = from p in dtc.People
where p.Gender == 1
select p;
dtc.People.RemoveAll(query);
try
{
dtc.SubmitChanges();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
Console.Read();
}
}
}
この結果の一部ですが、以下のようにデータの内容を確認しながら削除が一件ずつ行われていることが確認できます。
ここで、対象のデータを抽出した後、削除すべきデータの内容が変更されていたらどうなるでしょうか。dtc.SubmitChanges(); の行にブレークポイントを設定し、データベースの内容を直接変更してみます。
ここでは、以下のようなエラーが表示されました。
そして、データベースの内容はプログラムを実行する前と終了した時点でまったく変わっていません。
つまり、RemoveAllを利用して複数のデータを削除する場合、自動的にトランザクションが開始され、途中でエラーになるとロールバックが行われるのです。
きちんと考えられてますよねぇ。