Дозвуковой 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>