实体框架查询连接和按问题分组

时间:2013-11-28 18:09:36

标签: asp.net sql linq entity-framework-5 oracle11gr2

请更正查询

IN PL / SQL

SELECT a.MENU_ID, a.menu_label, a.menu_value  
FROM tbl_ims_menu a, TBL_IMS_ROLE_ASSIGNED_MENU b,TBL_IMS_USER_ROLE_PRIVILEGES c 
WHERE a.menu_id = b.menu_id   AND b.urole_id = c.granted_role   
                              AND c.user_id = '3'   AND a.menu_master <> '0'  
                              AND a.menu_status = 'Active' 
GROUP BY a.menu_id, a.menu_label, a.menu_value

查询工作正常,在Entity framework

中重写时存在一些问题

检查以下查询

List<TBL_IMS_MENU> listSubMenu = (from m in db.TBL_IMS_MENU   
                                  join ra in db.TBL_IMS_ROLE_ASSIGNED_MENU on m.MENU_ID 
                                  equals ra.MENU_ID   
                                  join rp in db.TBL_IMS_USER_ROLE_PRIVILEGES on ra.UROLE_ID
                                  equals rp.GRANTED_ROLE   
                                  where rp.USER_ID == UserID   
                                  group m by m.MENU_ID
                                  into g select g).ToList();

如果我使用Var而不是List那么如何触发循环?

2 个答案:

答案 0 :(得分:0)

我认为您需要删除join语句 - 并像在原始SQL查询中一样使用where

var qry  = (from a in db.TBL_IMS_MENU   
            from b in db.TBL_IMS_ROLE_ASSIGNED_MENU 
            from c in db.TBL_IMS_USER_ROLE_PRIVILEGES 

            where c.USER_ID == UserID
            where b.UROLE_ID == c.GRANTED_ROLE
            where a.MENU_ID  == b.MENU_ID 
            where a.menu_status == "Active" 
            where a.menu_master != "0" 
            select a)
           .GroupBy(c => c.menu_id)
              .ThenBy(c => c.menu_label)
                .ThenBy(c => c.menu_value)
           .ToList();

答案 1 :(得分:0)

尝试这样的事情:

var listSubMenu = (from m in db.TBL_IMS_MENU   
                                  join ra in db.TBL_IMS_ROLE_ASSIGNED_MENU on m.MENU_ID 
                                  equals ra.MENU_ID   
                                  join rp in db.TBL_IMS_USER_ROLE_PRIVILEGES on ra.UROLE_ID
                                  equals rp.GRANTED_ROLE   
                                  where rp.USER_ID == UserID   
                                  group m by new { m.MENU_ID, m.menu_label, m.menu_value }
                                  into g select g).ToList();

foreach(var groupItem in listSubMenu)
{
   // go through groups like this - groupItem.Key.MENU_ID
   foreach(var menuItem in grouItem)
   {
       //go through each item in group like this - menuItem.GRANTED_ROLE
   }
}