При использовании Linq попытка выбрать все записи, не входящие в мой локальный набор, завершается неудачей:
var localset = new List<Category>();
localset.Add( new Category { pk1 = 1, pk2 = 1, name = "one" } );
localset.Add( new Category { pk1 = 1, pk2 = 2, name = "two" } );
var dbCategories = dc.Categories;
var diff = dbCategories.Except(localset);
Мне нужно сделать базовый CRUD: удалить из набора БД, когда его нет в моем локальном наборе, обновить там, где существует, и добавить новое, если его там нет.
Я бы обычно делал:
delete from Category C where not exists
( select null from LocalSet L where C.pk1 = L.pk1 and C.pk2 = L.pk2 )
update Category set name = L.name
from LocalSet L
where L.pk1 = Category.pk1 and L.pk2 = Category.pk2
insert into Category (pk1, pk2, name)
select pk1, pk2, name
from LocalSet L
where not exists (
select null from Category C where L.pk1 = C.pk1 and L.pk2 = C.pk2 )
Достаточно легко, подумал я. Тем не менее, .Contains, кажется, единственный метод, который работает с локальными наборами, и он, кажется, сравнивает только одно поле. Таблица базы данных имеет составные ключи.
Без изменения составных ключей, есть ли способ выполнить эти задачи?