使用单个LINQ查询使用Entity Framework删除多个记录

我正在尝试使用LINQ执行DELETE,这将生成单个查询。

我是这样做的:

// NorthwintEntities is an ADO.NET Entitity Data Model var northwindEntities = new NorthwindEntities(); northwindEntities.Order_Details.Delete(o => o.Order_ID == 11076); 

这是我的扩展:

 public static class EntityExtensions { private static Regex rxTableName = new Regex(@"^FROM\s+(?\[[^\]]*\](\.\[[^\]]*\]){0,2})\s+AS\s+(?\[[^\]]*\])", RegexOptions.Multiline); public static void Delete(this ObjectSet entity, Expression<Func> expression) where T : EntityObject { var selectQuery = entity.Where(expression).Select(x => 1); string selectQueryString = ((ObjectQuery)selectQuery).ToTraceString(); string deleteQueryString = ConvertSqlSelectToDelete(selectQueryString); entity.Context.ExecuteStoreCommand(deleteQueryString); } private static string ConvertSqlSelectToDelete(string selectQuery) { if (selectQuery.IndexOf(" JOIN ") > -1) { throw new Exception("Query with JOIN is not supported: " + selectQuery); } Match match = rxTableName.Match(selectQuery); if (!match.Success) { throw new Exception("Unable to convert SELECT: " + selectQuery); } string deleteQuery = "DELETE \r\n" + selectQuery.Substring(match.Index); deleteQuery = deleteQuery.Replace(match.Groups["alias"].Value + ".", ""); deleteQuery = deleteQuery.Replace("AS " + match.Groups["alias"].Value, ""); return deleteQuery; } }

这有效,但我有一些意见。

  • 我不是在这里使用Regex的忠实粉丝,但这是我获得表名的唯一方法。 (entity.EntitySet.Name并不总是返回正确的名称。[Order Details]是一个例子)。
  • 完成此操作后,我发现这个http://msmvps.com/blogs/matthieu/archive/2010/05/21/bulk-delete-v3.aspx但无论如何都无法使其正常工作。 保持从上下文中获取NotImplementedException为null。
  • 使用连接删除似乎不起作用。 我正在使用SQL Server Compact 3.5进行测试,也许这是一个限制。

所以我的问题是:有更简单的方法吗? 如果是这样,它是什么?

任何帮助都将不胜感激。

  1. 安装entity framework扩展库(PM> Install-Package EntityFramework.Extended)

  2. 在代码中导入EntityFramework.Extensions

  3. 删除内部查询指定的记录

     context.Orders.Where(o=>o.User_ID == 1).Delete(); 

删除用户ID = 1的订单内的所有记录

批量删除的一种方法是在外键上设置ON CASCADE DELETE。 您需要在设计器中的关系上设置CASCADE,在数据库中的关系上设置ON CASCADE DELETE。

要从订单EF中删除产品导航属性,将向产品数据库(产品属性数)+1语句执行操作。

我更喜欢这样做:

 var order = context.Orders.Include(p=>p.Products).Where(o=>o.Order_ID == 11076); foreach(Product product in order.Products.ToList()) { context.Entry(product).State = EntityState.Deleted; } context.Entry(order ).State = EntityState.Deleted; context.SaveChanges(); 

希望能帮助到你。