LINQ sql выражение для исключения данных, присутствующих в другой таблице - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь написать запрос LINQ, чтобы вернуть список имен пользователей, которые еще не назначены. Моя таблица Usernames выглядит так:

Id | Username  
1  | user.1
2  | user.2
3  | user.3

Таблица Assignments содержит только имя пользователя, рядом с некоторыми другими данными:

Username | SomeOtherData
user.1   | foo
user.3   | bar

Запрос LINQ, который я пытаюсь написать, должен вернуть user.2 в приведенном выше примере.

К сожалению, мой запрос возвращает слишком много пользователей, и я не уверен, как настроить выражение LINQ:

from u in Usernames
    join a in Assignments on u.Username equals a.Username
    where u.Username != a.Username
    select u

Добавление метода Distinct () фильтрует набор результатов, но он по-прежнему возвращает имена пользователей, которым назначены:

(from u in Usernames
    join a in Assignments on u.Username equals a.Username
    where u.Username != a.Username
    select new { u }).Distinct()

Как лучше всего настроить эти выражения LINQ, чтобы возвращать только те имена пользователей, которых нет в таблице назначений?

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Вам необходимо выполнить левое соединение, используя DefaultIfEmpty. Примерно так:

from u in Usernames 
join a in Assignments on u.Username equals a.Username into userAssignments
from ua in userAssignments.DefaultIfEmpty()
    where ua == null
    select u
0 голосов
/ 01 мая 2018

Вы объединяете две таблицы по имени пользователя, которые не будут возвращать вам имена пользователей, которые не являются общими в обеих таблицах. Вам необходимо выбрать имена пользователей, которых нет в таблице назначений.

Context.Usernames.Where(x=> !Assignments.Select(y => y.Username).Contains(X.Username));

Другой способ написать тот же запрос:

Context.Usernames.Where(x=> Assignments.All(y => y.Username ! = x.UserName));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...