2009-05-15 28 views

Trả lời

23

Để xóa các bản ghi với Linq2Sql

 
CustomerDataContext ctx = new CustomerDataContext("connection string"); 
var customers = ctx.Customers.Where(c => c.Name == "david"); 

ctx.Customers.DeleteAllOnSubmit(customers); 
ctx.SubmitChanges(); 
+3

Đây là một trong những cách dễ nhất nhưng tôi không nói là hiệu quả nhất. 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. Xem bài đăng này - http://stackoverflow.com/questions/869209/bulk-deleting-via-linq – David

+0

Nếu bạn không sử dụng LINQ to SQL, hãy xem http://stackoverflow.com/q/1781175/24267 – mhenry1384

+0

Không thể chuyển đổi hoàn toàn loại 'System.Linq.IQueryable ' thành 'RajrangData.tblRelatedProduct'. Một chuyển đổi rõ ràng tồn tại (bạn có thiếu một diễn viên? – rahularyansharma

1

lẽ litle nó trễ cho câu trả lời này nhưng hôm nay tôi chạy vào này yêu cầu bản thân mình tôi và tôi đã đưa ra giải pháp này

CustomerDataContext ctx = new CustomerDataContext("connection string"); 

ctx.Customers.DeleteAllOnSubmit(ctx.Customers.Where(c => c.Name == "david")); 

ctx.SubmitChanges(); 
+4

Chắc chắn bạn không thể yêu cầu có 'đi lên' với giải pháp đó khi tất cả các bạn đã làm là di chuyển khai báo 'cust' từ câu trả lời phổ biến nhất sang phương thức' DeleteAllOnSubmit'. – Sheridan

0

Tôi đồng ý với Khurram, nó nhiều hiệu quả hơn để làm điều này với một thủ tục lưu trữ đơn giản với LINQ (miễn là bạn có đủ quyền trong SQL để thực hiện việc này). Tôi sẽ tăng cường điều này với một ví dụ.

Các thủ tục lưu trữ:

CREATE PROCEDURE [dbo].[RemovePermissionsFromRole] 
(
    @ROLE_ID int 
) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DELETE FROM [RolePermissions] WHERE [RoleID] = @ROLE_ID; 
END 

Kéo thủ tục lưu trữ từ cơ sở dữ liệu nhà thám hiểm vào các phương pháp pane trong tập tin DBML của bạn. Lưu các tập tin. Và trong mã:

if (Request.QueryString["RoleID"] != null) { 
    int roleID = Convert.ToInt32(Request.QueryString["RoleID"]); 

    SETSDataContext context = new SETSDataContext(); 
    context.RemovePermissionsFromRole(roleID); 
} 
1

Sử dụng khuôn khổ tổ chức 6

// Database context 
EntitiesContext db = new EntitiesContext(connString); 
// Select all the records to be deleted 
IEnumerable<entity> list = db.entity.where(x=>x.id == id).toList(); 
// Use Remove Range function to delete all records at once 
db.entity.RemoveRange(list); 
// Save changes 
db.SaveChanges(); 
2

Loại bỏ nhiều hồ sơ dựa trên đơn mệnh đề where

context.EntityModel 
      .RemoveAll(r => r.property == "propertyEntered"); 

Nhưng bạn cũng có thể loại bỏ các bản ghi từ cơ sở dữ liệu mà không làm tồn tại trong List<ListOfBadRecords>

context.EntityModel 
      .Where(w => w.propertyID == ID).ToList() 
      .RemoveAll(r => !ListOfBadRecords.Any(a => a.anyID == r.propertyID)); 

Edit:

không chắc chắn mà là nhanh hơn nhưng bạn có thể thực hiện truy vấn thứ 2 với điều này cũng

.RemoveAll(r => !ListOfBadRecords.Select(s=>s.propertyID).Contains(w.propertyID))

Edit2: đừng quên context.SaveChanges(); như tôi đã làm trong bản dự thảo đầu tiên

0

đây là Cách tôi giải quyết vấn đề:

 try 
     { 
      List<MaterialPartSerialNumber> list = db.MaterialPartSerialNumbers.Where(s => s.PartId == PartId && s.InventoryLocationId == NewInventoryLocationId && s.LocationId == LocationId).ToList(); 
      db.MaterialPartSerialNumbers.RemoveRange(list); 
      db.SaveChanges(); 
     } 
     catch(Exception ex) 
     { 
      string error = ex.Message; 
     } 

Trước tiên, bạn có thể tìm thấy danh sách o f các mục bạn muốn xóa.

Sau đó, bạn có thể sử dụng hàm RemoveRange(**list_of_item_to_delete**) để loại bỏ từng trường hợp trong danh sách hiện có trong cơ sở dữ liệu.

Theo MSDN, phương pháp loại bỏ một loạt các phần tử khỏi Danh sách.

Để biết thêm thông tin, kiểm tra xem nó ở đây https://msdn.microsoft.com/en-us/library/y33yd2b5(v=vs.110).aspx

+1

xin giải thích tại sao nó hoạt động không chỉ đăng mã như câu trả lời –

0

Đây là những gì tôi đã sử dụng, đầu tiên tạo ra một đối tượng IEnumerable của bảng nơi là các bản ghi phải được loại bỏ được, sau đó chỉ cần sử dụng RemoveRange, và cuối cùng chỉ cần lưu thay đổi cơ sở dữ liệu. Giả sử bạn muốn xóa tất cả các sản phẩm khỏi một ID nhà cung cấp cụ thể trên bảng Sản phẩm, đây là cách bạn có thể làm điều đó.

Sản phẩm IEsToRemove = db.Products.Where (x => x.SupplierId == Supplierid); db.Products.RemoveRange (ProductsToRemove); db.SaveChanges();

Các vấn đề liên quan