@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

DB削除フラグのLINQでの実装方法

投稿者投稿内容
Shane
大ベテラン
会議室デビュー日: 2003/06/06
投稿数: 132
お住まい・勤務地: Vancouver, BC
投稿日時: 2008-10-09 02:07
レコード削除に関して、物理的にレコードを削除するのではなく削除フラグフィールドが TRUE の時に削除とみなす、論理削除を LINQ を利用して実装したいのですがやり方がわかりません。

System.Data.Linq.ChangeSet の Deletes(クライアントで削除操作されたレコードエンティティ) の各エンティティに対し、 System.Data.Linq.DataContext の SubmitChanges() の前に削除フラグを立て、Deletes.Clear() としてみたのですが、Clear() のコールで NotSupportedException が発生してしまいました。

コードは以下のような感じです。

if (changeSet.Deletes.Count > 0)
{
foreach (var entity in changeSet.Deletes)
{
SetDeleteFlag(entity); // この中で削除フラグを立てる
}

changeSet.Deletes.Clear(); // ここで NotSupportedException が発生
}

DataContext.SubmitChanges();

削除フラグを利用した論理削除は多くのデベロッパーが使っていると思いますが、これを LINQ で使用するには皆さんどのようにされているのでしょうか?

[ メッセージ編集済み 編集者: Shin 編集日時 2008-10-09 02:09 ]
Shane
大ベテラン
会議室デビュー日: 2003/06/06
投稿数: 132
お住まい・勤務地: Vancouver, BC
投稿日時: 2008-10-09 02:32
自己レスです。

ストアドでオーバーライドする方法があるみたいですね。
http://msdn.microsoft.com/ja-jp/library/bb546186.aspx

できればストアドを使わない方法があればと思うのですが、他に方法があればどなたか教えてください。
Shane
大ベテラン
会議室デビュー日: 2003/06/06
投稿数: 132
お住まい・勤務地: Vancouver, BC
投稿日時: 2008-10-09 07:34
とりあえずストアドを作ってうまく行っています。

しかし論理削除に絡んでもう一つ問題が発生しています。

例えば、Order テーブルと親子関係になる OrderDetail テーブルがあるとします。Linq To SQL を使って以下のように1レコードを取得します。

var order =
(from n in dataContext.Orders
where n.OrderID == 1
select n).First();

そうすると、order.OrderDetails に自動にリレーション先の OrderDetail テーブルのレコードを取得してくれますが、ここに削除フラグの立ったレコードも入ってきてしまいます。

リレーション先の削除フラグの立ったレコードを弾くにはどのような方法が考えられるでしょうか?
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2008-10-09 09:33
OrderDetail側でSelect時に削除フラグがたっているデータを返さないようにする、とかかなぁ。
Shane
大ベテラン
会議室デビュー日: 2003/06/06
投稿数: 132
お住まい・勤務地: Vancouver, BC
投稿日時: 2008-10-10 01:40
コメントありがとうございます。

> OrderDetail側でSelect時に削除フラグがたっているデータを返さないようにする、とかかなぁ。

その方法を考えているのですが、どのような方法が考えられますか?

[ メッセージ編集済み 編集者: Shin 編集日時 2008-10-10 01:41 ]
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2008-10-10 09:54
ストアドを組み込む、ではだめなんでしょうか。
できそうな気はするけど。
Shane
大ベテラン
会議室デビュー日: 2003/06/06
投稿数: 132
お住まい・勤務地: Vancouver, BC
投稿日時: 2008-10-11 01:57
Insert/Update/Delete の振る舞いをストアドでオーバーライドできるようなのですが、Select にはできなさそうなんです。

Viewを使うとかかな・・・。あまりやりたくないけど・・・。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2008-10-11 15:40
僕は試してないんだけれど、以前 ScottGu のブログで取り上げられていた Dynamic LINQ は使えない?
http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx


_________________
かるあ のメモスニペット

スキルアップ/キャリアアップ(JOB@IT)