Câu hỏi Xóa hàng loạt trong LINQ thành đối tượng


Có cách nào để xóa hàng loạt đối tượng phù hợp với truy vấn đã cho trong LINQ hoặc LINQ-to-Entities không? Các tài liệu tham khảo duy nhất mà tôi có thể tìm thấy là lỗi thời, và nó có vẻ ngớ ngẩn để lặp lại và xóa thủ công tất cả các đối tượng tôi muốn loại bỏ.


76
2018-05-15 15:02


gốc




Các câu trả lời:


Câu hỏi là một câu hỏi cũ (từ trước khi EF5 tồn tại). Đối với bất kỳ ai đang sử dụng EF5, EntityFramework.Extended làm điều này trong tích tắc.


28
2017-11-22 15:17



Cảm ơn. Tôi đã cập nhật điều này là câu trả lời được chấp nhận. - Benjamin Pollack
EF 6 RemoveRange  stackoverflow.com/a/21468165/1876572 - Eldho


Một thời gian ngắn, tôi đã viết một loạt 4 phần blog (Các bộ phận 1, 2, 3 và 4) bao gồm thực hiện cập nhật hàng loạt (với một lệnh) trong Khuôn khổ thực thể.

Trong khi trọng tâm của loạt bài đó đã được cập nhật, bạn chắc chắn có thể sử dụng các nguyên tắc liên quan để xóa.

Vì vậy, bạn sẽ có thể viết một cái gì đó như thế này:

var query = from c in ctx.Customers
            where c.SalesPerson.Email == "..."
            select c;

query.Delete();

Tất cả những gì bạn cần làm là triển khai phương thức mở rộng Delete (). Xem chuỗi bài viết để biết các gợi ý về cách ...

Hi vọng điêu nay co ich


54
2018-05-15 17:59



Loạt tuyệt vời. Viết một phương thức mở rộng Delete () dựa trên điều này sẽ là tầm thường. - Benjamin Pollack
Sẽ là tốt đẹp khi có một mẫu mã cho điều này ở đây nếu có ai có nó! - jocull
Có thể tìm thấy một loạt các phương thức mở rộng (bao gồm xóa hàng loạt) tại đây: github.com/loresoft/EntityFramework.Extended - Soliah
Cẩn thận github.com/loresoft/EntityFramework.Extended có một sự phụ thuộc vào EF5, nếu bạn sử dụng Nuget Package manager Console để cài đặt nó, nó sẽ không yêu cầu bạn cài đặt EF5 - Paul Zahra
Hm ... vì vậy câu trả lời cho câu hỏi là chuyển hướng tới 4 bài đăng trên blog thay vì trình bày câu trả lời cụ thể cho khán giả. - DeepSpace101


    using (var context = new DatabaseEntities())
    {
        // delete existing records
        context.ExecuteStoreCommand("DELETE FROM YOURTABLE WHERE CustomerID = {0}", customerId);
    }

38
2017-07-07 16:07



+1 - Rất vui khi xem ví dụ về cách thực thi mã SQL bằng EF - Carlos P
Tôi nhận ra điều này có lẽ là cách duy nhất để làm điều này, ngắn của việc tạo ra một thủ tục được lưu trữ, nhưng điều này cảm thấy như gian lận =). Bây giờ tôi đang sử dụng này, tôi bị cám dỗ để sử dụng nó ở một số nơi khác để cicumvent của lol quirkiness lol - chẳng hạn như tham gia trái phức tạp và nhóm bys ..... :) - Losbear
+! ... khi sử dụng DB, bạn sẽ thấy rằng công cụ bạn muốn là một tuốc nơ vít .. EF chỉ là một cái búa khác. - gbjbaanb
Nhược điểm nhẹ: bây giờ bạn có một lệnh cơ sở dữ liệu bị ngắt kết nối khỏi môi trường phát triển. Nó không được gõ mạnh, do đó, một sự thay đổi cơ sở dữ liệu cho các cột trong SQL này sẽ không được đánh dấu trong Visual Studio - Ian


Các câu trả lời tôi thấy ở đây là LINQ to Sql

DeleteAllOnSubmit là một phần của System.Data.Linq và ITable là LINQ to Sql

Điều này không thể được thực hiện với Entity Framework.

Có nói rằng tất cả những gì tôi chưa có giải pháp nhưng sẽ đăng lại khi tôi làm


6
2018-03-30 18:57





Đối với những người sử dụng EF6 và muốn thực hiện truy vấn SQL hàng để xóa:

using (var context = new DatabaseEntities())
{
    // delete existing records
    context.Database.ExecuteSqlCommand("DELETE FROM YOURTABLE WHERE CustomerID = @id", idParameter);
}

4
2017-07-08 08:15



Điều này làm việc cho tôi trong EF 5 nhưng tôi đã phải sử dụng @ p0 cho param. Điều tốt đẹp là nó cung cấp loại kiểm tra an toàn loại trong sql được tạo ra: vì vậy trong EF5, điều này sẽ làm việc: context.Database.ExecuteSqlCommand ("DELETE FROM YOURTABLE WHERE CustomerID = @ p0", idParameter); \ @ p1 cho thông số tiếp theo, v.v ... - Nathan Prather


Tôi biết DeleteAllOnSubmit phương thức của bất kỳ ngữ cảnh dữ liệu nào sẽ xóa tất cả các bản ghi trong truy vấn. Phải có một số tối ưu hóa cơ bản vì rất nhiều đối tượng đang bị xóa. Tôi không chắc chắn.


3
2018-05-15 15:07



Có thực sự không phải là bất kỳ tối ưu hóa được thực hiện. SQL được tạo liệt kê tất cả các đối tượng phù hợp với truy vấn của bạn, sau đó tự lặp lại chúng để xóa chúng. Cấp, lặp lại xảy ra trong DB, chứ không phải trong mã của bạn, nhưng bạn vẫn không cần xây dựng một tập kết quả chỉ để xóa nội dung của nó - vẫn còn tệ hơn một bảng "DELETE FROM WHERE foo = bar" đơn giản, được xây dựng không có kết quả nào được đặt và chỉ bao gồm bảng một lần. - Benjamin Pollack


Tôi không chắc chắn nó sẽ hiệu quả như thế nào, nhưng bạn có thể thử một cái gì đó như thế này:

// deletes all "People" with the name "Joe"
var mypeople = from p in myDataContext.People
               where p.Name == "Joe";
               select p;
myDataContext.People.DeleteAllOnSubmit(mypeople);
myDataContext.SubmitChanges();

2
2018-05-15 15:14



Điều đó vẫn kết thúc lặp trên tất cả các phần tử phù hợp với truy vấn; nó chỉ làm như vậy trên DB, thay vì trong mã của bạn. Hiệu quả hơn, nhưng vẫn còn xa một giải pháp lý tưởng. - Benjamin Pollack
Cách duy nhất khác tôi có thể nghĩ để làm điều đó, sau đó, sẽ là để làm myDataContext.ExecuteCommand ("DELETE ...") ;. Xa lý tưởng, cũng vậy, nhưng nó sẽ hoạt động. - Scott Anderson


YOu có thể viết một proc được lưu trữ để xóa và gọi nó từ LINQ. Việc xóa dựa trên tập tin có thể nhanh hơn nhưng nếu nó ảnh hưởng đến quá nhiều bản ghi bạn có thể gây ra các vấn đề về khóa và bạn có thể cần lai vòng lặp thông qua tập hợp các bản ghi (có thể 2000 tại một thời điểm, kích thước phụ thuộc vào thiết kế cơ sở dữ liệu của bạn. nơi bắt đầu nếu bạn tìm thấy các delte dựa trên thiết lập mất quá lâu nó đang ảnh hưởng đến việc sử dụng khác của bảng) để làm xóa.


1
2018-05-15 17:28





Xóa dữ liệu thông qua khung thực thể dựa vào việc sử dụng phương thức DeleteObject. Bạn có thể gọi phương thức này trên EntityCollection cho lớp thực thể mà bạn muốn xóa hoặc trên ObjectContext dẫn xuất. Đây là một ví dụ đơn giản:

NorthwindEntities db = new NorthwindEntities();

IEnumerable<Order_Detail> ods = from o in db.Order_Details
                                where o.OrderID == 12345                                    
                                select o;

foreach (Order_Detail od in ods) 
    db.Order_Details.DeleteObject(od);

db.SaveChanges();

1
2017-11-11 23:12



Tuy nhiên, đó không phải là "Xóa hàng loạt". - Nuzzolilo