您不能根据需要使用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