亚音速3联盟的可能?(Subsonic 3 Union Possible?)

2019-07-29 06:06发布

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

菜单有一个类别ID。

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

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

我想用6类别ID,并为那些有PAGEID的用户角色必须在指定页面这些角色所有菜单项返回。

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

    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 SQL结果连接(见下文),但再次转换到这个LINQ /亚音速失败。

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;

Answer 1:

它看起来像你撞到亚音速的实施联盟/的毗连的错误,你应该把它报告给谷歌代码的网站。 你应该能够做到以下几点,我敢肯定你已经制定了:

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;


Answer 2:

叶,我认为报告LEFT OUTER JOIN问题之一。 抢劫告诉我,这个问题是由LINQ的解析器(IQueryable的提供商implement执行)。 我认为这是主要的问题,因为如果你无法做的不仅仅是基本的querys更多的 - 你不能用它在所有的工作...

所以推抢着尽快将其修复。 :-)。

扎西。



Answer 3:

如果产生填写您的匿名类型的SQL查询不匹配,没办法:你必须做这样的事情:

dd.ToList().AddRange(ss.ToList());

,当然,这意味着你的数据库双重要求。



文章来源: Subsonic 3 Union Possible?