如何从DbContext中删除列表中有列表的记录

我有一个具有表Gizmos的DbContext

public Gizmo
{
   public Guid Id {get;set;}
   public ICollection<Widget> Widgets {get;set;} = new List<Widget>();
}

因此Gizmo可以具有小部件列表。

我想从Gizmo中删除1个小部件。

我无法从上下文直接访问Widget。必须通过Gizmo完成。

我想做类似的事情:

_context.Gizmos.SelectMany(x => x.Widgets).Remove(x => x.Id == myId);
_context.SaveChanges();
xk312339548 回答:如何从DbContext中删除列表中有列表的记录

您不能根据需要使用Linq,因为查询不允许处理原始源,因为查询是包含过滤和转换后的引用的收集结果。

您无需Linq即可轻松实现目标

2019-09-20 00:30:51.234260+00:00    4.63
2019-09-20 00:50:51.292892+00:00    4.40
2019-09-20 01:30:51.273058+00:00    4.54
2019-09-20 01:50:51.270876+00:00    4.44
2019-09-20 02:30:51.267385+00:00    4.55
                                    ... 
2019-10-30 22:57:35.003066+00:00    1.71
2019-10-30 23:12:34.965801+00:00    1.61
2019-10-30 23:27:34.976495+00:00    1.56
2019-10-30 23:42:34.984976+00:00    1.26
2019-10-30 23:57:34.965543+00:00    1.05

ToList()是为了避免在删除时发生索引冲突。

最快的选择

foreach ( var gizmo in _context.Gizmos )
  foreach (var widget in gizmo.Widgets.ToList() )
    if ( widget.Id == myId )
      gizmo.Widgets.Remove(widget);

在查询中使用Linq和循环以删除项目

for ( int indexGizmo = 0; indexGizmo < _context.Gizmos.Count(); indexGizmo++ )
{
  var gizmo = _context.Gizmos[indexGizmo];
  for ( int indexWidget = gizmo.Widgets.Count() - 1; indexWidget >= 0; indexWidget-- )
  {
    var widget = gizmo.Widgets[indexWidget];
    if ( widget.Id == myId )
      gizmo.Widgets.Remove(widget);
  }
}
,

您不能同时执行查询(选择)和非查询(删除)。您首先必须下载它,并将其显示在内存中,这就是“ ToList()”的作用。比您可以删除它。您可以在“位置”子句中附加“选择项”,以便仅下载要删除的项目。

var list = _context.Gizmos.SelectMany(x => x.Widgets).Where(x => x.Id == myId).ToList();
_context.Widgets.RemoveRange(list);
_context.SaveChanges();
enter code here

但是,通常,如果您具有小部件的ID,则转到小部件的DbSet并将其删除。 您无需照顾将其从Gizmos中删除。 EF和SQL会解决这个问题。

如果您的ID是唯一的,并且只需要一件商品,您也可以只使用

SingleOrDefault(x => x.Id == myId)

代替Where和ToList()

如果ID是主键,则只需使用

var widget = context.Widgets.Find(myID);
context.Widgets.Remove(widget);
context.SaveChanges();

作为进一步的优化,您可以阅读“无需获取即删除”,以免除首先下载的要求,然后再删除某些内容。

那将是

 var widget = new Widget { ID = myID };
 context.Widgets.Attach(widget);
 context.Entry(width).State = EntityState.Deleted;
 context.SaveChanges();
本文链接:https://www.f2er.com/3157736.html

大家都在问