LINQ исключение - PullRequest
       14

LINQ исключение

4 голосов
/ 03 февраля 2009

Существует ли прямой синтаксис LINQ для поиска членов множества A, которые отсутствуют в множестве B? В SQL я бы написал это

SELECT A.* FROM A LEFT JOIN B ON A.ID = B.ID WHERE B.ID IS NULL

Ответы [ 3 ]

11 голосов
/ 03 февраля 2009

См. Документацию MSDN по , кроме оператора .

3 голосов
/ 03 февраля 2009
var results = from itemA in A
              where !B.Any(itemB => itemB.Id == itemA.Id)
              select itemA;
3 голосов
/ 03 февраля 2009

Я думаю, что ваш 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, вы можете обнаружить потенциальные проблемы с производительностью только из самого запроса. Еще раз спасибо Маслоу за выделение этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...