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

本文关键字:记录 删除 Entity 单个 LINQ 查询 Framework | 更新日期: 2023-09-27 18:20:20

我正在尝试使用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+(?<table>'[[^']]*']('.'[[^']]*']){0,2})'s+AS's+(?<alias>'[[^']]*'])", RegexOptions.Multiline);
    public static void Delete<T>(this ObjectSet<T> entity, Expression<Func<T, bool>> 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但无论如何都无法让它发挥作用。一直从为null的上下文中获取NotImplementedException
  • 使用联接进行删除似乎不起作用。我正在用SQL Server Compact 3.5进行测试,也许这是一个限制

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

任何帮助都将不胜感激。

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

  1. 安装实体框架扩展库(PM>安装程序包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();

希望能有所帮助。