我正在使用Entity Framework从表中删除多个项目.没有外键/父对象,因此我无法使用OnDeleteCascade处理此问题.
现在我这样做:
var widgets = context.Widgets
.Where(w => w.WidgetId == widgetId);
foreach (Widget widget in widgets)
{
context.Widgets.DeleteObject(widget);
}
context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
它有效但是foreach让我烦恼.我正在使用EF4,但我不想执行SQL.我只是想确保我没有遗漏任何东西 - 这一切都很好,对吧?我可以用扩展方法或帮助器来抽象它,但在某个地方我们仍然会做一个foreach,对吧?
在某些原因,我需要在EFCore中使用SQL,我将使用映射实体的表名.我怎么才能得到它?
在LINQ to SQL中,我可以这样做:
context.User_Roles.DeleteAllOnSubmit(context.User_Roles.Where(ur => ur.UserId == user.UserId));
Run Code Online (Sandbox Code Playgroud)
什么与实体框架相当?
我读到新的实体框架将包含一个删除多个项目的方法(Linq to SQL有DeleteAllOnSubmit()),但我找不到这样做的函数/方法.
这是在Beta 2还是我必须自己制作?
更新:
这就是我现在使用的:
public void DeleteObjects(IEnumerable<object> objects)
{
foreach (object o in objects)
{
DeleteObject(o);
}
SaveChanges();
}
Run Code Online (Sandbox Code Playgroud) 嗨,我正在寻找一次删除多个记录的有效方法.我正在删除400条记录,需要8-15秒.这是我的代码
using (var entities = new Entity())
{
foreach (Item item in entities.Items.Where(x => x.id == id))
entities.DeleteObject(item);
entities.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud) 可能重复:
LINQ to Entities中的批量删除
我需要按条件删除一些实体.例如,删除数量小于1的所有订单商品:
var orderId = 10; // any order Id
context.OrderItems.RemoveWhere(item => item.OrderId == orderId && item.Quantity < 1.0);
Run Code Online (Sandbox Code Playgroud)
我知道,我可以选择这些项目,然后像这样一个一个地删除它们:
var itemsToRemove = context.OrderItems.Where(item => item.OrderId == orderId && item.Quantity < 1.0).ToArray();
foreach (var item in itemsToRemove)
context.OrderItems.Remove(item);
Run Code Online (Sandbox Code Playgroud)
但这是不太可能的,因为会有额外的工作.我错过了什么吗?
我对Entity Framework完全不熟悉,所以请原谅我,如果我的逻辑偏差/这是事情已经发挥作用的方式,但我正在开发一个应用程序,其中:
ParentId
ParentId
,我将数千条记录存储在父表中具有一对多外键关系的子表中.因此,如果父母的信息发生变化(这可能经常发生),我想要做的是让我的程序执行相当于:
DELETE FROM ChildTable WHERE ParentId = 'xx'
Run Code Online (Sandbox Code Playgroud)
在使用相同ParentId的新/更新值更新子表之前.
从我所看到的,我这样做的方式是:
ctx.Database.ExecuteSqlCommand()
概念类型输入实际的SQL命令以最有效的方式在EF中执行此操作的正确方法是什么?
我想使用 linq 从表中批量删除记录。有一篇文章描述了如何做: Bulk-deleting in LINQ to Entities
var query = from c in ctx.Customers
where c.SalesPerson.Email == "..."
select c;
query.Delete();
Run Code Online (Sandbox Code Playgroud)
但是我的 var 变量中不存在函数“Delete”。
此外,我的上下文中不存在函数“SubmitChanges”。
我在c#中删除了一个应用程序,我利用linq to entities
它在我的应用程序中构建查询.但是我发现我的应用程序在添加和删除记录时非常慢.删除500条记录大约需要15分钟.那太久了.我的删除查询如下.
public void deletePayrollBatch(int batchNo)
{
var context = new DataSources.sspEntities();
var query1 = (from a in context.Payroll_Details
where a.Payroll_BatchBatch_no == batchNo
select a).ToList();
foreach (var x in query1)
{
context.DeleteObject(x);
context.SaveChanges();
}
}
Run Code Online (Sandbox Code Playgroud)
我的查询相当简单.一行数据确实包含大约20列.我不知道这是否会产生影响.无论如何,如果我能得到一些专家建议,那将会有所帮助.谢谢.
编辑.
基于删除,我已经有了很好的建议.其中之一是context.SaveChanges()
在循环之外使用.在我的插入中,我有类似的代码(如下所示),但我需要首先保存记录,因为我希望ID在另一个函数中使用它.在这种情况下,我该怎么办?
foreach (var xyz in x)
{
Try{
pDetails1.EstateID = 143;
pDetails1.Employee_Personal_InfoEmp_id = xyz.PD_EmpPersonal_Id;
pDetails1.PAYE = (decimal)xyz.PD_PAYE.GetValueOrDefault();
pDetails1.PAYE_YTD = (decimal)PayeYTD.GetValueOrDefault();
pDetails1.Basic_Pay = (decimal)xyz.PD_BasicPay.GetValueOrDefault();
pDetails1.Basic_Pay_YTD = (decimal)basicpay_YTD.GetValueOrDefault();
pDetails1.Gross_Pay = (decimal)xyz.PD_GrossPay.GetValueOrDefault();
pDetails1.Gross_Pay_YTD = (decimal)GrossPay_YTD.GetValueOrDefault();
context.SaveChanges();
Functions.RandomFunct rf = new RandomFunct(); …
Run Code Online (Sandbox Code Playgroud) c# ×5
.net ×2
linq ×2
linq-to-sql ×2
.net-4.0 ×1
.net-core ×1
asp.net-core ×1
database ×1
vb.net ×1