更新n:m关系没有太多开销

本文关键字:太多 开销 关系 更新 | 更新日期: 2023-09-27 18:13:04

我得到了Products, KeywordsProductKeywords这三个表之间的n:m关系

现在每次我更新Product时,我都为List<Keyword>提供新的选择的关键字。此集合可以包含已经选择为产品关键字的关键字,以及新的或已删除的关键字。现在我想在我的数据库中更新这个

现在我清除整个ProductKeywords表,其中ProductKeywords.ProductId等于Product.Id。当然,这会产生非常多的开销,因为它清除了特定产品的任何关键字。

是否有一种简单的方法来更新这个n:m关系,而不清除之前的整个产品关键字?因此,它应该删除不再存在于新的List<Keyword>集合中但仍在表中的ProductKeywords,以及添加不存在于表中但存在于List<Keyword>中的新ProductKeywords。所有其他(表中和List<Keyword>中)应该保持不变,以减少开销。

更新n:m关系没有太多开销

  1. 它应该删除ProductKeywords不再出现在新的列表集合中,但仍在表中,
  2. 以及添加新的ProductKeywords,这些新ProductKeywords尚未出现在表中,但在列表中。

这是你的两个操作;简单地分开做。

List<Keyword> existingKeywordsForProduct = ...;
List<Keyword> newKeywordsForProduct = ...;
var keywordsToRemove = existingKeywordsForProduct.Except(newKeywordsForProduct);
var keywordsToAdd = newKeywordsForProduct.Except(existingKeywordsForProduct);

如果现有的关键字将相当小,那么你会想把它们全部拉到一个列表中,并使用LINQ to Objects来执行Except调用。如果列表非常大,那么最好将其保留为IQueryable<Keyword>并进行两次往返,以便Except调用可以在DB端完成。