1

私はそのようなスキーマを持っています。Menu->Pages->PageRoles->ASPNetRoles

メニューには CategoryID があります。

CategoryID が 6 のすべてのメニュー項目を返したいと考えています。

一部のメニュー項目には、PageID の foreigh キーがあります。ページは、それらに対して 1 つ以上の役割を持つことができます。現在ログインしているユーザーの役割を確認し、それらがテーブルを結合して結果に含まれていることを確認できます。

CategoryID が 6 のすべてのメニュー アイテムを返したいと思います。Pag​​eID を持つものについては、ユーザー ロールがページに割り当てられたロールに含まれている必要があります。

私が考えることができる唯一の方法は、結合を行うことですが、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;
4

3 に答える 3

1

SubSonic の Union/Concat の実装でバグに遭遇したようです。Google コード サイトに報告してください。次のことを実行できるはずです。これは、すでに解決していると確信しています。

var unionList = dd.Concat(ss).ToList<Menu>();

それまでの間、以下はあなたが求めている外部結合にかなり近いはずです:

var ss =  from menu in Menu.All()
    group join pages in WebPage.All() on menu2.PageID equals pages.ID
      into pagesMenu from pm in pagesMenu.DefaultIfEmpty()
    group join pagesRoles in PageRole.All() on pages.ID equals pagesRoles.PageID
      into pagesRolesPages from prp in pagesRolesPages.DefaultIfEmpty()
    group join roles in aspnet_Role.All() on pagesRoles.RoleId equals roles.RoleId
      into pagesRolesRoles from prr in pagesRolesRoles.DefaultIfEmpty()
  where menu.PageID == null || 
    (Roles.GetRolesForUser().Contains(roles.RoleName) && menu2.CategoryID == 6)
  select menu;
于 2009-06-29T16:32:51.203 に答える