我知道在LINQ-to-SQL中这是可行的,我还看到了一些线索,让我相信它在EF中也是可行的。是否有扩展可以像这样做:
var peopleQuery = Context.People.Where(p => p.Name == "Jim");
peopleQuery.DeleteBatch();
DeleteBatch
就是从 peopleQuery 中拆分出所有相应记录并创建一个单一的 SQL 语句,然后直接执行查询而不是标记所有这些实体进行删除并逐个进行。我认为在下面的代码中找到了类似的东西,但它立即失败,因为 instance 无法转换为 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;
}