Удаление строк в таблице с помощью Linq to SQL

У меня есть спортивная база данных с таблицей groupmembers, которые имеют поля ID, groupID и memberID. Я получаю memberID из текстового поля txtRemoveGroupMember и groupID из списка флажков. Теперь я хочу удалить строки, которые имеют как groupID, так и memberID. Я пробовал этот код:

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();
}

но я получаю эту ошибку: Ошибка 7 Аргумент 1: не удается конвертировать из 'системы.В LINQ.IQueryable ' to ' GSI_side.GroupMember'

и эта ошибка: Ошибка 6 лучших перегруженный метод матч за 'систему.Данные.В LINQ.Таблица.Метод Deleteonsubmit(GSI_side.GroupMember)' имеет некоторые недопустимые аргументы

надеюсь, кто-то может помочь мне понять это!

3 ответов


вы должны позвонить .ToList ()

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

для пакетных удалений я использую этой, потому что LINQ to SQL сначала загружает все данные, которые будут удалены, а затем удаляет каждый по каждому.

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


removeFromGroup по-прежнему типа IQuerable.

вам нужно указать фактический GroupMember удалить.

вы могли бы использовать

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


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

кроме того, если ваш запрос возвращает коллекцию (судя по ее виду, это не будет, так как вы фильтруете по memberId) можно использовать

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


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

var listToRemove=(from a in DB.Table
             where a.Equals(id)
             select a).ToList();

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