LinQ to Entities: запрос с пятью таблицами - PullRequest
2 голосов
/ 16 июня 2011

У меня есть пять таблиц с первичным ключом с идентификатором

  • Пользователь
  • User_Role_Relation с внешними ключами User_ID и Role_ID
  • Role
  • Role_Right_Relation с внешними ключами Role_ID и Right_ID
  • Right

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

  SELECT DISTINCT 
      tbl_Right.ID, tbl_Right.Name    
  FROM 
      tbl_User_Role_Relation 
  INNER JOIN 
      tbl_Role_Right_Relation ON tbl_User_Role_Relation.Role_ID =  tbl_Role_Right_Relation.Role_ID 
  INNER JOIN 
      tbl_Right ON tbl_Role_Right_Relation.Right_ID = tbl_Right.ID
  WHERE 
      tbl_User_Role_Relation.User_ID = @User_ID

Я пытаюсь преобразовать это в LINQ to Entity с этим кодом

var query = from r in context.Rights
            from rrr in r.Role_Right_Relation
            from rl in rrr.Role
            from urr in rl.User_Role_Relation
            where urr.User_ID == userid
            select r;

, но получаю следующую ошибку

Выражение типа 'Models.Role' не разрешено впоследующее предложение from в выражении запроса с типом источника 'System.Linq.IQueryable' Не удалось определить тип при вызове 'SelectMany'

Любой совет будет полезен.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 16 июня 2011

Прежде всего, этот запрос linq выполняет перекрестное соединение, а не внутреннее соединение, как ваш sql.Вы должны проверить this

Во-вторых, вам, вероятно, будет лучше правильно определить отношения между сущностями в edmx, и вам, вероятно, вообще не нужно будет присоединяться, вместо этого вы можетеиспользуйте свойства навигации для доступа к родительским / дочерним элементам и фильтрации по этим свойствам напрямую

Идея структуры сущностей заключается в том, что вам не нужно выравнивать иерархию

0 голосов
/ 16 июня 2011

Если вы используете синтаксис метода, вы сможете сделать что-то вроде:

var user = context.Users.FirstOrDefault(u => u.Id == userId);
var rights =user.Roles.SelectMany(role => role.Rights).Distinct();

Перед тем, как получить права, убедитесь, что пользователь не равен нулю

0 голосов
/ 16 июня 2011

Изменить 3

Если вы опубликовали свой код дословно, значит, вам не хватает строки

from u in urr.Users

Итак:

var query = from r in context.Rights
from rrr in r.Role_Right_Relation
from rl in rrr.Role
from urr in rl.User_Role_Relation
from u in urr.Users
where u.User_ID == userid
select r;

Или, по крайней мере, есть опечатка и где следует читать:

where urr.User_ID == userid

, что приводит к:

var query = from r in context.Rights
from rrr in r.Role_Right_Relation
from rl in rrr.Role
from urr in rl.User_Role_Relation
where urr.User_ID == userid
select r;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...