Linq to EF - выберите «Многие», чтобы отфильтровать любые вхождения с одной стороны множества ко многим - PullRequest
0 голосов
/ 04 августа 2011

Моя схема - довольно простая схема членства и ролей:

Users table:
UserId (PK)
UserName
etc...

Roles table:
RoleId (PK)
RoleName

UsersInRole table
UserId (FK to Users table)
RoleId (FK to ROles table)

Итак, у нас есть таблица «многие ко многим» UsersInRole вместе с двумя другими таблицами. Когда я добавляю схему в EF, сгенерированный код ORM (и конструктор EF) показывает только пользователей и роли (без проблем, EF управляет многими ко многим).

Итак, вот мой вопрос. Я хочу перечислить всех пользователей, у которых нет роли «Супер Админ». Похоже, простая проблема, просто используйте SelectMany в EF. Проблема в том, что у пользователя может быть несколько ролей, одна из которых - «Супер Администратор». Если я использую SelectMany (как показано ниже), я все равно получу тех пользователей, у которых есть «Super Admin» в дополнение к другим ролям. SelectMany работает только в том случае, если у пользователя есть одна роль, и эта роль называется «Super Admin»

Я пытался собрать SQL для работы с этим в Linq-to-EF, но мне тоже не повезло.

var usrQry = context.Roles.Where(r => r.RoleName != "Super Admin")
        .SelectMany(r => r.Users);

Любая помощь приветствуется - заранее спасибо.

1 Ответ

1 голос
/ 04 августа 2011

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

Ваше заявление было:

Я хочу перечислить всех пользователей, у которых нет роли «Супер Админ»

Так вот код для этого.

var userQry = context.Users.Where(
                u => !u.Roles.Any(r => r.RoleName == "Super Admin"));

в синтаксисе LINQ:

var userQry = from u in context.users
              where !u.Roles.Any(r => r.RoleName == "Super Admin")
              select u;
...