LINQ to SQL Сравнение запросов «многие ко многим» - PullRequest
1 голос
/ 05 августа 2009

Я только что закончил создание настраиваемого поставщика ролей, используя LINQ to SQL для доступа к данным. Одна из функций, которую нужно написать для провайдера, - удалить пользователей из ролей;

public void RemoveUsersFromRoles(string[] usernames, string[] rolenames);

Теперь один подход будет;

  1. вернуть список ролей
  2. итерация для каждой роли и удаление этой роли у всех пользователей, имеющих эту роль

Этот подход далеко не эффективен. Я хотел бы знать, есть ли лучшие способы решения этого типа проблем в LINQ to SQL.

Есть ли способ создать оператор выбора в LINQ to SQL, который будет принимать массив строк для сравнения, вместо того, чтобы зацикливаться и делать N выборок? Любой подход лучше, чем я описал выше, будет высоко оценен.

Вовлеченные таблицы:

User (RecordID, Username)
Role (RecordID, Rolename)
UsersInRole (RoleID,UserID)

Спасибо!

1 Ответ

4 голосов
/ 05 августа 2009

Это должно работать:

var uirQuery = from uir in db.UsersInRole
               join u in db.User on uir.UserID equals u.RecordID
               join r in db.Role on uir.RoleID equals r.RecordID
               where usernames.Contains(u.Username) 
                  && rolenames.Contains(r.Rolename)
               select uir;

db.UsersInRole.DeleteAllOnSubmit(uirQuery);

LINQ to SQL переводит выражение «Содержит» в предложение T-SQL IN.

...