0

これら 3 つのテーブル間に n:m の関係があります: ProductsKeywordsおよびProductKeywords

を更新するたびに、新しく選択したキーワードProductを に提供します。このコレクションには、製品キーワードとして既に選択されているキーワードと、新しいキーワードまたは削除されたキーワードを含めることができます。今、私は自分のデータベースでこれを更新したいと考えています。List<Keyword>

今のところ、 equalsのProductKeywordsテーブル全体をクリアしています。もちろん、これは特定の製品のキーワードをクリアするため、非常に多くのオーバーヘッドを生み出します。ProductKeywords.ProductIdProduct.Id

以前に製品キーワード全体をクリアせずに、この n:m 関係を更新する簡単な方法はありますか? そのため、新しいList<Keyword>コレクションには存在しないがテーブルにはまだ存在する ProductKeywords を削除し、テーブルにはまだ存在しないがList<Keyword>. オーバーヘッドを軽減するために、その他すべて (表に示されているものと に示されているList<Keyword>もの) はそのままにしておく必要があります。

4

1 に答える 1

1
  1. 新しい List コレクションには存在しないが、テーブルにはまだ存在する ProductKeywords を削除する必要があります。
  2. また、表にはまだ存在しないがリストには存在する新しい ProductKeywords を追加します。

これらは 2 つの操作です。それらを別々に行うだけです。

List<Keyword> existingKeywordsForProduct = ...;
List<Keyword> newKeywordsForProduct = ...;

var keywordsToRemove = existingKeywordsForProduct.Except(newKeywordsForProduct);
var keywordsToAdd = newKeywordsForProduct.Except(existingKeywordsForProduct);

既存のキーワードがかなり小さい場合は、それらをすべてリストにまとめて、LINQ to Objects を使用してExcept呼び出しを行う必要があります。リストが非常に大きくなる場合は、それを として保持し、DB 側で呼び出しを実行できるIQueryable<Keyword>ように 2 つのラウンド トリップを実行することをお勧めします。Except

于 2013-05-09T15:14:57.880 に答える