gpt4 book ai didi

c# - 使用单个 LINQ 查询使用 Entity Framework 删除多条记录

转载 作者:可可西里 更新时间:2023-11-01 08:43:05 25 4
gpt4 key购买 nike

我正在尝试使用将生成单个查询的 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但无论如何都无法让它工作。不断从上下文中获取 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();

删除 Orders 中 userID = 1 的所有记录

关于c# - 使用单个 LINQ 查询使用 Entity Framework 删除多条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8878741/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com