【发布时间】:2012-01-22 06:13:13
【问题描述】:
我知道这在 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;
}
【问题讨论】:
标签: .net sql entity-framework ef-code-first extension-methods