Ваше предложение полностью верно - лучшего способа сделать это не существует.
У вас есть небольшая ошибка / опечатка
var toAdd = dc.PersonSports.Where(x=>!sportIDs.Contains(x.SportID));
, который должен быть (и вы должны использовать верблюжий случай для параметров метода)
var toAdd = PersonSports.Where(x=>!sportIDs.Contains(x.SportID));
Единственное, что я хотел бы сделать, это подумать о том, нужно ли вам определять, какие записи следует удалять и удалять, прежде чем выполнять какие-либо операции вставки и обновления базы данных. Вы можете столкнуться с проблемами, если ваш метод более сложный, чем этот, потому что коллекция может измениться до того, как вы перечислите. Я предпочитаю, чтобы мои коллекции оценивались немедленно.
// just get the sport ids from the database here
// rather than the entire PersonSport objects
var toRemove = dc.PersonSports.Where(x=>!sportIDs.Contains(x.SportID)).ToList();
var toAdd = PersonSports.Where(x=>!sportIDs.Contains(x.SportID)).ToList();
if (toRemove.Any())
{
dc.PersonSports.DeleteAllOnSubmit(toRemove);
}
if (toAdd.Any())
{
dc.PersonSports.InsertAllOnSubmit(toAdd);
}
dc.SubmitChanges();
Наконец, обратите внимание, что это прекратится, если у вас более 2100 видов спорта, потому что идентификаторы будут отправлены в качестве параметров, а это жесткий предел SQL для максимального количества параметров. Если это проблема, вы можете подсчитать, сколько параметров вы работаете, и выполнить их 2000 одновременно.