Я пытаюсь выполнить DELETE с помощью LINQ, который будет генерировать один запрос.Удаление нескольких записей с помощью Entity Framework с использованием одного запроса LINQ
Вот как я это делаю:
// NorthwintEntities is an ADO.NET Entitity Data Model
var northwindEntities = new NorthwindEntities();
northwindEntities.Order_Details.Delete(o => o.Order_ID == 11076);
Вот мой Extension:
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 не всегда возвращает правильное имя. [Пример заказа] является примером).
- По завершении этого, я нашел это http://msmvps.com/blogs/matthieu/archive/2010/05/21/bulk-delete-v3.aspx, но не смог заставить его работать в любом случае. Не удалось получить исключение NotImplementedException из контекста, являющегося нулевым.
- Удалить с помощью команды join не работает. Я тестирую SQL Server Compact 3.5, возможно, это ограничение.
Итак, мои вопросы: есть ли более простой способ сделать это? Если так, то, что это?
Любая помощь вообще будет оценена по достоинству.
Пожалуйста, взгляните на [вопрос] [1]. [1]: http://stackoverflow.com/questions/8538899/ –
Вы считали RemoveRange в EF6? Я хотел бы знать, насколько это «оптимизировано» и что он работает. http://msdn.microsoft.com/en-us/library/system.data.entity.dbset.removerange(v=vs.113).aspx – Colin
Получение имени таблицы из метаданных - http://stackoverflow.com/a/18964974/150342 – Colin