我有以下数据库:Posts,其中有一个Id,Tags也与Id,以及TagsToPosts表,其中有TagsToPosts.PostId => Posts.Id和TagsToPosts.TagId => Tags.Id FK关系。我需要通过以下方式从TagsToPosts中删除多个项目。我通过解析一个字符串来创建IList<Tag> newTags。每个标记都有自己的名称。我想删除所有指向单个帖子(TagsToPosts.PostId == mypostid)的TagsToPosts项目,这些项目指向名称不在我的newTags中的Tag。
例如,我有一个带有Id = 1的帖子,有三个标签:1 => "tag1", 2 => "tag2", 3 => "tag3"和ManyToMany关系表TagsToPosts:1 => 1, 1 => 2, 1 => 3,所以所有这三个标签都链接到我的帖子。之后,我将通过解析一个字符串来创建一个新的IList<Tag> newList = new List<Tag>()。newList包含:0 => "tag1", 0 => "tag2"。现在,我想从表TagsToPosts中删除第三个关系,因为我的新标记列表不包含名为"tag3“的标记。所以我需要找出不同之处。我知道我可以使用JOIN找到相似的项目,但如何找到不同之处?
我希望这在一个DB查询中发生,而不是迭代每个项目来删除它。
发布于 2009-10-09 06:21:58
使用LINQ-to-SQL不能做到这一点。
LINQ-to-SQL不适合批处理操作-它不能执行批插入、批更新和批删除。集合中的每个对象都是单独处理的。您可以在一个事务中执行所有操作,但始终会对每条记录进行查询。
MSDN
更好的选择是编写一个可以执行您想要的操作的存储过程。
发布于 2009-03-17 15:37:25
你看过Linq Except运算符吗?
例如:
var toDelete = (from t in TagsToPost
select t).Except(from nt in newList
select nt, new TagComparer());
class TagComparer: IEqualityComparer<TagsToPosts>
{
public bool Equals(TagsToPosts x, TagsToPosts y)
{
return x.Tag.Equals(y.Tag, CompareOptions.Ordinal);
}
}发布于 2009-11-04 02:01:34
PLINQO支持批量删除操作,而无需首先检索实体。
var TagsToPost = from t in newList select t).Except(from nt in newList select nt,TagsToPost TagComparer())
Context.Tags.Delete(删除);
http://plinqo.com
https://stackoverflow.com/questions/654561
复制相似问题