【问题标题】:How can I use set operations to delete objects in an entitycollection that match a collection of view models?如何使用集合操作删除实体集合中与视图模型集合匹配的对象?
【发布时间】:2012-01-13 19:14:49
【问题描述】:

这是我想做的一个非常基本的例子。我想出的代码似乎很冗长......即循环通过集合等。

我正在使用 Telerik MVC 网格,它回发一组已删除、插入和更新的 ViewModel。视图模型与实体相似但不完全相同。

例如...我有:

Order.Lines。 Lines 是包含 OrderDetail 记录的实体集合(导航属性)。在使用我的控制器的更新操作中,我有一个从 POST 数据中提取的列表名称 DeletedLines。我还查询了数据库并拥有包含 Lines 集合的 Order 实体。

现在我基本上想告诉它删除 Lines EntityCollection 中的所有 OrderDetails。

我的做法是这样的:

foreach (var line in DeletedLines) {
   db.DeleteObject(Order.Lines.Where(l => l.Key == line.Key).SingleOrDefault())
}

我希望有一种方法可以使用 .Interset() 获取要删除的实体集合并将其传递给 DeleteObject。但是,DeleteObject 似乎只接受单个实体而不是集合。

也许以上已经足够好了..但似乎应该有一个更简单的方法。

谢谢, 鲍勃

【问题讨论】:

  • FWIW,你可以添加一个简单的扩展方法来一次删除多个,但它只会做一个 foreach :)

标签: linq asp.net-mvc-3 entity-framework-4 linq-to-objects entitycollection


【解决方案1】:

DeletedLines 中的项目是否附加到上下文中?如果有,那这个呢?

foreach (var line in DeletedLines) db.DeleteObject(line);

回复评论 #1

好的,我现在明白了。你可以让你的代码更短一点,但不多:

foreach (var line in DeletedLines) {
   db.DeleteObject(Order.Lines.SingleOrDefault(l => l.Key == line.Key))
}

我不确定 DeleteObject 在传递 null 时是否会引发异常。如果是这样,您最好使用 Single,只要您确定该项目在其中:

foreach (var line in DeletedLines) {
   db.DeleteObject(Order.Lines.Single(l => l.Key == line.Key))
}

【讨论】:

  • No.. DeletedLines 是 ViewModel 的集合...所以它们不在上下文中。
  • 谢谢。虽然传递 Lambda 更简洁一些,但我想实际上并没有办法为此使用 linq SetOperations。至少我能说出来。
【解决方案2】:

如果您不想重新查询数据库并且已经拥有映射表 PK 值(或者可以将它们包含在客户端调用中),您可以使用 Alex James 的删除技巧之一,无需先检索:

http://blogs.msdn.com/b/alexj/archive/2009/03/27/tip-9-deleting-an-object-without-retrieving-it.aspx

【讨论】:

    猜你喜欢
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 2022-10-04
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多