我在这三个表之间建立了n:m关系:Products
,Keywords
和ProductKeywords
现在,每当我更新Product
时,我都会为List<Keyword>
提供新选择的关键字。此集合可以包含已被选为产品关键字的关键字,以及新的或已删除的关键字。现在我想在我的数据库中更新它。
目前我正在清除ProductKeywords
等于ProductKeywords.ProductId
的整个Product.Id
表格。当然,这会产生非常的开销,因为它会清除特定产品的任何关键字。
是否有一种简单的方法来更新此n:m关系而不清除之前的所有产品关键字?因此,它应该删除新List<Keyword>
集合中不存在但仍在表中的ProductKeywords,以及添加表中尚未出现但在List<Keyword>
中的新ProductKeywords。所有其他人(列于表中并出现在List<Keyword>
中)应保持不变,以减少开销。
答案 0 :(得分:1)
- 它应该删除新的List集合中不存在但仍在表中的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
次调用。