Я думаю, что ваш LINQ будет выглядеть примерно так:
var items = A.Except(
from itemA in A
from itemB in B
where itemA.ID == itemB.ID
select itemA);
Обновление
Как указано в комментариях Маслоу , это может быть не самый производительный запрос. Как и в любом коде, важно выполнить определенный уровень профилирования, чтобы устранить узкие места и неэффективные алгоритмы. В этом случае ответ Chaowman обеспечивает лучший результат.
Причины можно увидеть при небольшом изучении запросов. В приведенном мною примере есть как минимум два цикла над коллекцией A - 1 для объединения списка A и B, а другой для выполнения операции Except
, тогда как в ответе chaowman (воспроизводится ниже ), коллекция A повторяется только один раз.
// chaowman's solution only iterates A once and partially iterates B
var results = from itemA in A
where !B.Any(itemB => itemB.Id == itemA.Id)
select itemA;
Кроме того, в моем ответе коллекция B повторяется полностью для каждого элемента в A, тогда как в ответ Chaowman она повторяется только до точки, в которой найдено совпадение.
Как вы можете видеть, даже прежде чем взглянуть на сгенерированный SQL, вы можете обнаружить потенциальные проблемы с производительностью только из самого запроса. Еще раз спасибо Маслоу за выделение этого.