DoctorJonez спасибо !!!
Я помещаю это здесь, поскольку у меня есть больше места. У меня есть 11 записей в таблице меню, только 1 с установленным PageID, однако, если я использую
var test = Menu.All().Where(x => x.WebPages.Any(pages => pages.Roles.Contains(Roles.GetRolesForUser()[0])
Я получаю 11 записей, так как SQL-запрос это
SELECT [t0].[CategoryID], [t0].[CreatedBy], [t0].[CreatedOn], [t0].[ID], [t0].[ImageID], [t0].[ImageIDHover], [t0].[Locale], [t0].[ModifiedBy], [t0].[ModifiedOn], [t0].[OrderID], [t0].[PageID], [t0].[ParentID], [t0].[Title], [t0].[URL], [t0].[Visible]
FROM [dbo].[Menu] AS t0
WHERE EXISTS(
SELECT NULL
FROM [dbo].[WebPage] AS t1
WHERE ([t1].[Roles] LIKE '%' + 'User' + '%')
)
Если я запускаю это, я получаю 1 запись
var test = Menu.All().Where(x => x.WebPages.Any(pages => pages.Roles.Contains(Roles.GetRolesForUser()[0]) && pages.ID == x.PageID));
SQL для этого
SELECT [t0].[CategoryID], [t0].[CreatedBy], [t0].[CreatedOn], [t0].[ID], [t0].[ImageID], [t0].[ImageIDHover], [t0].[Locale], [t0].[ModifiedBy], [t0].[ModifiedOn], [t0].[OrderID], [t0].[PageID], [t0].[ParentID], [t0].[Title], [t0].[URL], [t0].[Visible]
FROM [dbo].[Menu] AS t0
WHERE EXISTS(
SELECT NULL
FROM [dbo].[WebPage] AS t1
WHERE (([t1].[Roles] LIKE '%' + 'User' + '%') AND ([t1].[ID] = [t0].[PageID]))
)
Это ошибка в Subsonic или я не правильно ее понимаю?
Проблема с Any () состоит в том, что в SQL, пока одна запись завершается, не имеет значения, какая запись вернет данные.
Я думаю, что эффективно хочу UNION SQL, как показано ниже, но я не знаю, как я могу преобразовать это в C # / Subsonic
select m.* from menu m where pageid is null
union
select m.* from menu m
join webpage p
on p.id = m.pageid
where p.roles like '%User%'
Я хочу вернуть все записи меню, и для тех с установленным PageID, что соответствующая веб-страница имеет роль пользователя в этом. Если роль пользователя отсутствует на веб-странице, я не хочу видеть ее в своих результатах.