EF Code First Delete Batch From IQueryable ?

Я знаю, что это возможно в 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;
}
5
задан Ocelot20 16 December 2011 в 19:02
поделиться