私はそのようなスキーマを持っています。Menu->Pages->PageRoles->ASPNetRoles
メニューには CategoryID があります。
CategoryID が 6 のすべてのメニュー項目を返したいと考えています。
一部のメニュー項目には、PageID の foreigh キーがあります。ページは、それらに対して 1 つ以上の役割を持つことができます。現在ログインしているユーザーの役割を確認し、それらがテーブルを結合して結果に含まれていることを確認できます。
CategoryID が 6 のすべてのメニュー アイテムを返したいと思います。PageID を持つものについては、ユーザー ロールがページに割り当てられたロールに含まれている必要があります。
私が考えることができる唯一の方法は、結合を行うことですが、Subsonic でこれを行うと失敗します。以下の作品。
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;
結果を組み合わせるにはどうすればよいですか?
これを行うと失敗します:
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);
編集:
LEFT OUTER JOINS (以下を参照) を介して SQL で結果を取得できますが、これを LINQ/Subsonic に変換すると失敗します。
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')))
こんな単純なことでも失敗する
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;