【发布时间】:2012-01-16 10:33:13
【问题描述】:
我正在尝试使用将生成单个查询的 LINQ 执行删除。
这是我的做法:
// 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;
}
}
这可行,但我有几个 cmets。
- 我不喜欢在这里使用 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 进行测试,也许这是一个限制。
所以我的问题是:有没有更简单的方法可以做到这一点?如果有,是什么?
任何帮助都将不胜感激。
【问题讨论】:
-
请看一下[问题][1]。 [1]:stackoverflow.com/questions/8538899
-
您是否考虑过 EF6 中的 RemoveRange?我想知道它“优化”了多少以及它运行什么 sql。 msdn.microsoft.com/en-us/library/…
-
从元数据中获取表名 - stackoverflow.com/a/18964974/150342
标签: c# linq entity-framework