Как преобразовать утверждение SQL, содержащее ограничение NOT IN, в эквивалентный LINQ? - PullRequest
2 голосов
/ 20 июня 2011

Я использую Linq около года, и у меня есть только грубое понимание SQL.Так что следующая проблема может быть банальной, и я прошу прощения за это сейчас.Но на работе меня попросили выяснить наиболее эффективный способ использования linq на следующем sql.и мне нужна помощь.

У меня есть таблица клиента и таблица ClientParticiaption.В таблице ClientParticiaption указываются клиенты, участвующие в специальной программе обучения.Мне нужно определить, какие Клиенты не участвуют в специальной программе обучения.Вот SQL, который работает:

SELECT *
FROM Client
WHERE ClientControlID NOT IN
(
  SELECT ClientControlID
  FROM ClientParticipation
)

У меня проблемы с преобразованием этого в эквивалентный оператор linq.Я думаю, что я должен использовать оператор Except, но я не уверен, как в этом случае.Любые мысли были бы очень полезны.

Вот то, что я сейчас делаю, и это работает, но я подозреваю, что это не очень эффективно.Обратите внимание, что я использую Entity Framework и, возможно, неправильно предположил, что решение этой проблемы не имеет никакого отношения к EF.

IList<int> clientControlIDs =
    ClientArngmt.Select(
    cac => cac.ClientControlID ).ToList();

IList<int> particiaptionClientArngmtIDs =
    Participations.Select(
    cap => cap.ClientArngmtID ).ToList();

IEnumerable<int> notParticipatingClientArngmtIDs =
    clientArngmtIDs.Except(
    particiaptionClientArngmtIDs );

Ответы [ 2 ]

3 голосов
/ 20 июня 2011

вы можете использовать оператор where, например

        IList<Client> clients = (from cac in ClientArngmt
                                 where !(Participations.Select(cap => ClientArngmtID).Contains(cac.ClientControlID))
                                 select cac).ToList();
1 голос
/ 20 июня 2011

1-й раствор:

ClientArngmt
 .Where(c => !Participations.Select(p => p.ClientArngmtID).Contains(c.ClientControlID))
 .Select(c => c);

2-й раствор:

Participations
 .Where(p => !p.Clients.Any()) // Just assuming Clients is the ObjectSet name for ClientArngmt
 .SelectMany(p => p.Clients)
 .Distinct(); // If you want to get them distinct
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...