Я думаю, что запутался, потому что вижу в вашем запросе следующую иерархию, которая не имеет никакого смысла:
[PageRoles]
|--RoleId <~~~~~~~~~.
|--[aspnet_Roles] |
|--RoleId ~~~~~~~*
|--RoleName
Определяется ли иерархия RoleId
, и вы имеете в виду только PageRoles.RoleId
для ссылки aspnet_Roles.RoleId
? Так что у вас может быть что-то вроде:
[PageRoles] [aspnet_Roles]
|--RoleId |--RoleId
|--RoleName
И вы пытаетесь превратить это в следующее:
[PageRoles]
|--RoleId
|--[aspnet_Roles] (where RoleId == PageRoles.RoleId)
|--RoleName
...
В этом случае, если вы не можете сделать следующее, тогда что-то не так с вашими определениями свойств IQueryable , а не с отправленным вами запросом. А именно, метод получения дочерних строк PageRoles
aspnet_Roles
настроен неправильно.
var f = (from fd in item.PageRoles
from k in fd.aspnet_Roles
where Roles.GetRolesForUser().Contains(k.RoleName)
select k.RoleName)
.Count();
(fd.aspnet_Roles
уже должен быть ограничен RoleId
и генерировать внутреннее соединение).
Вы можете проверить свою иерархию, посмотрев, из чего генерируется SQL:
var f = from fd in item.PageRoles
from k in fd.aspnet_Roles
select k;
, который должен иметь смутное сходство (с чем-то, что связано с добавленным предметом):
SELECT k.RoleName, k.SomethingElse
FROM PageRoles fd
INNER JOIN aspnetRoles k ON fd.RoleId = k.RoleId;
Я уверен, что что-то упустил, поэтому, пожалуйста, помогите мне заполнить пробелы ...