Tôi biết điều này là có thể trong LINQ-to-SQL, và tôi đã nhìn thấy các bit và miếng dẫn tôi tin rằng nó có thể trong EF. Có một phần mở rộng ra có thể làm một cái gì đó như thế này:Mã EF Đầu tiên Xóa Lô Từ IQueryable <T>?
var peopleQuery = Context.People.Where(p => p.Name == "Jim");
peopleQuery.DeleteBatch();
ở đâu DeleteBatch
chỉ chọn ngoài các peopleQuery và tạo ra một câu lệnh SQL duy nhất để xóa tất cả các hồ sơ thích hợp, sau đó thực hiện truy vấn trực tiếp thay vì đánh dấu tất cả những các thực thể để xóa và làm cho chúng từng cái một. Tôi nghĩ rằng tôi tìm thấy một cái gì đó như thế trong mã dưới đây, nhưng nó không thành công ngay lập tức bởi vì dụ không thể được đúc vào ObjectSet. Có ai biết cách sửa lỗi này để làm việc với EF Code First không? Hoặc biết bất cứ nơi nào có một ví dụ về việc này đang được thực hiện?
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;
}
Tôi đồng ý với bạn 100% trên tất cả các điểm của bạn, nhưng đó là một nguy cơ chấp nhận được trong dự án của chúng tôi xem xét việc thực hiện nghiêm túc hit thực hiện làm nó theo cách chính thức. Cảm ơn vì sự trả lời! – Ocelot20