亚音速3联盟的可能? [英] Subsonic 3 Union Possible?

查看:281
本文介绍了亚音速3联盟的可能?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有像这样的模式。菜单 - > Pages-> PageRoles-> ASPNetRoles

菜单有一个类别ID。

我想用6类别ID所有菜单项返回。

某些菜单项PAGEID的FOREIGH关键。页面可以对他们的1个或多个角色。我可以检查当前登录的用户的角色,并确保他们在结果通过连接的表。

我想用6类别ID,并为那些有PAGEID的用户角色必须分配给该页面的角色,所有菜单项返回。

我能想到的唯一方法是做一个工会,但我这样做是亚音速时失败。下面的工作。

  VAR DD =(从Menu.All菜单(),其中(X =方式> x.PageID == NULL和放大器;&安培; x.CategoryID == 6)选择菜单);
    在Menu.All变种SS =从MENU2()
              加入WebPage.All()页面上menu2.PageID等于pages.ID
              加入pagesRoles在PageRole.All()上pages.ID等于pagesRoles.PageID
              加入角色aspnet_Role.All()上pagesRoles.RoleId等于roles.RoleId
              。其中,Roles.GetRolesForUser()包含(roles.RoleName)及和放大器;
              menu2.CategoryID == 6
              选择MENU2;

如何合并的结果?

这样做失败了:

  VAR DD =(从Menu.All菜单(),其中(X =方式> x.PageID == NULL)选择菜单).Union(
              从Menu.All MENU2()
              加入WebPage.All()页面上menu2.PageID等于pages.ID
              加入pagesRoles在PageRole.All()上pages.ID等于pagesRoles.PageID
              加入角色aspnet_Role.All()上pagesRoles.RoleId等于roles.RoleId
              其中,Roles.GetRolesForUser()。包含(roles.RoleName)
              选择MENU2);

编辑:

我可以得到通过LEFT OUTER SQL结果连接(见下文),但再翻译成LINQ /亚音速失败。

  SELECT * FROM M菜单LEFT OUTER JOIN WEBPAGE P
ON P.ID = M.PAGEIDLEFT OUTER JOIN PAGEROLESř
ON R.PAGEID = P.IDLEFT OUTER JOIN ASPNET_ROLES一个
ON A.ROLEID = R.ROLEIDWHERE((类别id = 1)或(类别id = 1 AND A.ROLENAME IN(管理员,用户)))

即使是一些简单的像这样的失败

  VAR地区环境部门一道=从db.Menus p
加入db.WebPages页面上p.PageID等于pages.ID
成从temp.DefaultIfEmpty页温度()
器选择p;


解决方案

它看起来像你撞到亚音速的实现联盟/的毗连的一个bug,你应该把它报告给谷歌code网站。
你应该能够做到以下几点,我敢pretty相信你们已经制定了:

  VAR unionList = dd.Concat(SS).ToList<菜单>();

在此期间,以下应该是pretty接近外加入你之后:

  VAR SS =从Menu.All菜单()
    组加入WebPage.All()页面上menu2.PageID等于pages.ID
      进入pagesMenu从分在pagesMenu.DefaultIfEmpty()
    组加入pagesRoles在PageRole.All()上pages.ID等于pagesRoles.PageID
      成pagesRolesPages.DefaultIfEmpty从PRP pagesRolesPages()
    组加入aspnet_Role.All()作用于pagesRoles.RoleId等于roles.RoleId
      成pagesRolesRoles.DefaultIfEmpty从PRR pagesRolesRoles()
  其中,menu.PageID == NULL ||
    (Roles.GetRolesForUser()包含(roles.RoleName)及和放大器; menu2.CategoryID == 6)
  选择菜单;

I have a schema like so. Menu->Pages->PageRoles->ASPNetRoles

Menu has a CategoryID.

I want to return all Menu items with a CategoryID of 6.

Some Menu items have a foreigh key of PageID. Pages can have 1 or more roles against them. I can check the currently logged in users roles and make sure that they are in the results by joining the tables.

I want to return all Menu items with a CategoryID of 6 and for those that have PageID's the users role must be in those roles assigned to the page.

The only way I can think is to do a union but when I do this in Subsonic it fails. The following works.

    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;

How do I combine the results?

Doing this it fails:

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);

EDIT:

I can get the results in SQL via LEFT OUTER JOINS (See Below) but again translating this into LINQ/Subsonic fails.

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')))

Even something simple like this fails

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;

解决方案

It looks like you're bumping into a bug in SubSonic's implementation of Union/Concat, you should report it to the google code site. You should just be able to do the following, which I'm pretty sure you'd already worked out:

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

In the meantime the following should be pretty close to the outer join you're after:

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;

这篇关于亚音速3联盟的可能?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆