Дозвуковой 3 Союз Возможно?

У меня есть такая схема. Меню- & GT; Pages- & GT; PageRoles- & GT; ASPNetRoles

Меню имеет CategoryID.

Я хочу вернуть все пункты меню с CategoryID 6.

Некоторые пункты меню имеют переднюю клавишу PageID. Страницы могут иметь 1 или более ролей против них. Я могу проверить роли пользователей, вошедших в систему, и убедиться, что они в результатах, присоединившись к таблицам.

Я хочу вернуть все пункты меню с CategoryID, равным 6, и для тех, у кого есть PageID, роль пользователей должна принадлежать тем ролям, которые назначены странице.

Единственный способ, которым я могу думать, - это объединение, но когда я делаю это в Subsonic, это не удается. Следующие работы.

<code>    var dd = (from menu in Menu.All().Where(x => x.PageID == null && x.CategoryID == 6) select menu);
    var ss =  from menu2 in Menu.All()
              join pages in WebPage.All() on menu2.PageID equals pages.ID
              join pagesRoles in PageRole.All() on pages.ID equals pagesRoles.PageID
              join roles in aspnet_Role.All() on pagesRoles.RoleId equals roles.RoleId
              where Roles.GetRolesForUser().Contains(roles.RoleName) &&
              menu2.CategoryID == 6
              select menu2;
</code>

Как мне объединить результаты?

Делать это не удается:

<code>var dd = (from menu in Menu.All().Where(x => x.PageID == null) select menu).Union(
              from menu2 in Menu.All()
              join pages in WebPage.All() on menu2.PageID equals pages.ID
              join pagesRoles in PageRole.All() on pages.ID equals pagesRoles.PageID
              join roles in aspnet_Role.All() on pagesRoles.RoleId equals roles.RoleId
              where Roles.GetRolesForUser().Contains(roles.RoleName)
              select menu2);
</code>

EDIT:

Я могу получить результаты в SQL через LEFT OUTER JOINS (см. Ниже), но снова перевести это на LINQ / Subsonic не удается.

<code>SELECT * FROM MENU M

LEFT OUTER JOIN WEBPAGE P
ON P.ID = M.PAGEID

LEFT OUTER JOIN PAGEROLES R
ON R.PAGEID = P.ID

LEFT OUTER JOIN ASPNET_ROLES A
ON A.ROLEID = R.ROLEID

WHERE ((CATEGORYID = 1) OR ( CategoryID = 1 AND A.ROLENAME IN ('ADMINISTRATOR','USER')))
</code>

Даже что-то простое как это терпит неудачу

<code>var resu = from p in db.Menus 
join pages in db.WebPages on p.PageID equals pages.ID 
into temp from pages in temp.DefaultIfEmpty()
select p;
</code>

Ответы на вопрос(3)

Ваш ответ на вопрос