2009-03-25 12 views
2

興味深い問題があります。与えられたテーブルに列x、y、zが含まれていても、コンパイル時にどのテーブルを扱っているのか分からないということだけを知っているテーブル更新を実行できるLINQ to SQLを使用してコードを書く方法はありますか?共通の列を持つテーブルのDRY LINQステートメント

いくつかのカラムを共有する私のDBスキーマにいくつかのテーブルがあります。私たちが扱っているテーブルに関係なく、その論理的なプロシージャと同じセットベースのUPDATE操作を適用する必要があります。

ここでは、隣接関係モデル階層を実装する3つのテーブル(つまり、各行に主キーIDと自己参照の親ID列が含まれています)という簡単な例を示します。各テーブルには、「無効」論理フラグもあります。私はこれらのエンティティのいずれかのインスタンスを無効にすると、それは子項目をカスケードする必要があり、すなわち

無効UPDATE MyTableと SET = 1 ID = @IDまたはPARENT_ID = @ID

私にはありません各エンティティに対してこれらの種類のLINQ文を記述したい場合、DRYに違反します。この例ではわかりにくいかもしれませんが、例が複雑になるにつれて、ますます多くのコードを複製していきます。私はインターフェイスとおそらくジェネリックスを使用して可能でなければならないと確信していますが、私は洗練されたソリューションを考え出すのに苦労しています。

答えて

0

Aliのソリューションは(あなたの入力のおかげで)うまくいくだろうが、私の好みのソリューションは、インターフェイスと拡張メソッドを使用した 'mix-in'です。

http://msdn.microsoft.com/en-us/vcsharp/bb625996.aspx

http://mikehadlow.blogspot.com/2008/05/interface-extension-methods-mixin.html

これは私が

2新しい基本クラスをサポートするために、VS2008でLINQクラスの自動生成メカニズム、約いじる必要はありません)いくつかの利点 1を持っています)LINQクラスで継承階層を強制するのではなく、部分クラス宣言へのインターフェイスを追加するだけで、突然この新しく共有されたすべての機能がパーティに到着します!

3)必要に応じて、拡張メソッドを独自の名前空間に入れることができ、クライアントは他の実装のためにそれらをスワップアウトできます。私は、既存のIQueryableの実装を消費する非重複コードを書く、SQLクエリの機能にLINQをオーバーライドする必要はありません。このアプローチ

1

エンティティの基本クラスを作成し、共通プロパティを仮想プロパティとして移動するだけです。エンティティでこれらのプロパティをオーバーライドし、それらにColumn属性を指定します。詳細はexampleです。

1

LINQ to SQLクラスは、SQLに変換するIQueryインターフェイスをサポートする通常の.NETクラスです。

独自のIQuery実装を作成し、適切なテーブル用の生成されたLINQ to SQL IQuery実装を指すようにすることができます。 'TableName'というプロパティを追加し、それをサポートするために 'Where'をオーバーライドします。

この回答は完全な解決策ではないかもしれませんが、正しい方向に向けることができれば幸いです。

+0

に感謝

コメント。 – Matt