2013-11-28 37 views
0

請更正查詢實體框架查詢聯接和集團通過發行

在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 

查詢工作正常,有一些問題,當重寫實體框架

檢查以下查詢

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,那麼如何激發循環?

+0

什麼是錯誤你得到? – johnny

+0

var關鍵字只是類型推斷。調用ToList()之後查詢的類型將是IEnumerable,因此您可以像使用List一樣枚舉它。 –

回答

0

我認爲你需要刪除join陳述 - 而只需使用where就像你在原始的SQL查詢做:

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(); 
+0

@ user3046931爲您完成這項工作? –

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 
    } 
}