2012-02-29 80 views
9

Tôi có cơ sở dữ liệu thể thao với một nhóm bảng có các trường ID, groupID và memberID. Tôi nhận được memberID từ một hộp văn bản được gọi là txtRemoveGroupMember và groupID từ một danh sách kiểm tra. Bây giờ tôi muốn xóa các hàng có cả groupID và memberID. Tôi đã thử mã này:Xóa các hàng trong một bảng bằng LINQ to SQL

foreach(ListItem listItem in cblRemoveMemberFromGroup.Items) 
{ 
     int memberid = Convert.ToInt32(txtRemoveGroupMember.Text); 
     int groupid = Convert.ToInt32(listItem.Value); 

     var removeFromGroup = from gm in dataContext.GroupMembers 
      where (gm.memberID == memberid) && (gm.groupID == groupid) 
      select gm; 

     dataContext.GroupMembers.DeleteOnSubmit(removeFromGroup); 
     dataContext.SubmitChanges(); 
} 

Nhưng tôi nhận được lỗi này: Lỗi 7 Đối số 1: không thể chuyển đổi từ 'System.Linq.IQueryable' thành 'GSI_side.GroupMember'

Và lỗi này: Lỗi 6 Kết hợp phương pháp quá tải tốt nhất cho 'System.Data.Linq.Table.DeleteOnSubmit (GSI_side.GroupMember)' có một số đối số không hợp lệ

Hy vọng ai đó có thể giúp tôi tìm ra điều này!

+0

DeleteOnSubmit yêu cầu một đối tượng kiểu GroupMember và truy vấn LINQ trả về IQueryable. Đó là lý do tại sao nhận được lỗi. Hãy thử sử dụng removeFromGroup.ToList() để thay thế. – Dinesh

Trả lời

13

Bạn phải gọi ToList()

var items = removeFromGroup.ToList(); 
foreach (var item in items) 
    dataContext.GroupMembers.DeleteOnSubmit(item); 

Đối với hàng loạt xóa tôi sử dụng this, vì LINQ to SQL đầu tiên tải toàn bộ dữ liệu trong đó sẽ bị xóa, sau đó nó sẽ thực hiện xóa từng theo từng .

https://terryaney.wordpress.com/2008/04/14/batch-updates-and-deletes-with-linq-to-sql/

https://github.com/longday/LINQ-to-SQL-Batch-Updates-Deletes

+2

Cảm ơn bạn rất nhiều! Điều đó làm việc hoàn hảo =) – Twistar

+0

Xem câu trả lời của @ JeremyWiggins, có một phương thức DeleteAllOnSubmit(). –

+0

Các liên kết này đã chết ngay bây giờ, bạn có thể trỏ đến một vị trí mới hoặc tốt nhất là giải thích những gì họ nói không? – Dan

9

removeFromGroup vẫn là loại IQuerable.

Bạn cần chỉ định GroupMember thực tế để xóa.

Bạn có thể sử dụng

GroupMember removeFromGroup = (from gm in dataContext.GroupMembers 
           where (gm.memberID == memberid) && (gm.groupID == groupid) 
           select gm).SingleOrDefault(); 


dataContext.GroupMembers.DeleteOnSubmit(removeFromGroup); 
dataContext.SubmitChanges(); 

Ngoài ra, nếu truy vấn của bạn trả về một bộ sưu tập (từ vẻ của nó, nó sẽ không vì bạn đang lọc theo memberId), bạn có thể sử dụng

List<GroupMember> removeFromGroup = (from gm in dataContext.GroupMembers 
            where (gm.memberID == memberid) && (gm.groupID == groupid) 
            select gm).ToList(); 


dataContext.GroupMembers.DeleteAllOnSubmit(removeFromGroup); 
dataContext.SubmitChanges(); 
4
var listToRemove=(from a in DB.Table 
      where a.Equals(id) 
      select a).ToList(); 

DB.Table.DeleteAllOnSubmit(listToRemove); 
DB.SubmitChanges();