Я знаю, что это возможно в LINQ-to-SQL, и я видел фрагменты, которые наводят меня на мысль, что это возможно в EF. Есть ли там расширение, которое может делать что-то вроде этого:
var peopleQuery = Context.People.Where(p => p.Name == "Jim");
peopleQuery.DeleteBatch();
Где DeleteBatch
просто разделяет peopleQuery и создает один оператор SQL для удаления всех соответствующих записей, а затем выполняет запрос напрямую вместо того, чтобы отмечать все эти сущности для удаления и выполнения их одну за другой. Я думал, что нашел что-то подобное в приведенном ниже коде, но он сразу же не работает, потому что экземпляр не может быть преобразован в ObjectSet. Кто-нибудь знает, как исправить это, чтобы работать с EF Code First? Или знаете где-нибудь, где есть такой пример?
public static IQueryable<T> DeleteBatch<T>(this IQueryable<T> instance) where T : class
{
ObjectSet<T> query = instance as ObjectSet<T>;
ObjectContext context = query.Context;
string sqlClause = GetClause<T>(instance);
context.ExecuteStoreCommand("DELETE {0}", sqlClause);
return instance;
}
public static string GetClause<T>(this IQueryable<T> clause) where T : class
{
string snippet = "FROM [dbo].[";
string sql = ((ObjectQuery<T>)clause).ToTraceString();
string sqlFirstPart = sql.Substring(sql.IndexOf(snippet));
sqlFirstPart = sqlFirstPart.Replace("AS [Extent1]", "");
sqlFirstPart = sqlFirstPart.Replace("[Extent1].", "");
return sqlFirstPart;
}