2016-01-29 44 views
0

我有一個存儲過程,它顯示錶格菜單中的菜單,然後根據用戶類型檢查用戶類型以更改菜單項的名稱。將sql存儲過程轉換爲Linq/lambda

MenuID, 
    Case When @UserType <> 'E' and MenuName='Admin' then 'My Profile' When @UserType = 'A' and MenuName='Change Password' then 'Change Agent Password' else MenuName End As MenuName, 
    ParentID, 
    MenuLink, 
    IconImagePath, 
    MenuTarget 
from tblMenus   
Where IsDeleted=0 and 
     IsEnabled=1 and 
     MenuID in (Select MenuID From #MenuChild)        
Or MenuID In(SELECT ParentID FROM #MenuChild t CROSS APPLY dbo.FindRoot2(t.menuid))        
Or MenuID = 1 order by MenuOrder, MenuName  

我一直在努力將整個過程轉換爲linq,現在看起來像這樣。

public List<tblMenu> getmainmenusclass() 
     { 
      var UserInfo = GetUserInfo(); 
      UserType = UserInfo[0].UserTypeID; 
      var menus = DataAccess.Menus.FindByExp(x => x.IsDeleted == false).ToList(); 
      if (UserType == "E") 
       { 
        menus = DataAccess.Menus.FindByExp(x => x.IsDeleted == false).ToList(); 
       } 

       if (UserType == "A") 
       { 
        var agentDist = GetAgentDistribution(); 
        Distribution = agentDist[0].AgtDistChannel; 
        if (Distribution == "P" || Distribution == "S") 
        { 
         menus = DataAccess.Menus.FindByExp(x => x.IsDeleted == false && x.MenuCategory != "DGB").ToList(); 

        } 
        if (Distribution == "G" || Distribution == "B") 
        { 
         menus = DataAccess.Menus.FindByExp(x => x.IsDeleted == false && x.MenuCategory != "DPS").ToList(); 

        } 
        if (Distribution == "W" || Distribution == "P") 
        { 
         menus = DataAccess.Menus.FindByExp(x => x.IsDeleted == false && x.MenuCategory != "DGB" && x.MenuName != "NEW Quoting Tool").ToList(); 
        } 

       } 
       else 
       { 
        var notAllowedMenuCategories = new[] { "DPS", "DGB", "D" }; 
        menus = DataAccess.Menus.FindByExp(x => x.IsDeleted == false && !notAllowedMenuCategories.Contains(x.MenuCategory)).ToList(); 

         if (Distribution == "G") 
        { 
         var notAllowedMenuCategoriesForG = new[] { "DPS", "DGB", "D", "PB" }; 
         menus = DataAccess.Menus.FindByExp(x => x.IsDeleted == false && !notAllowedMenuCategoriesForG.Contains(x.MenuCategory)).ToList(); 
        } 

       } 
       if (MarketingGroup != "BWCU" && MarketingGroup != "''") 
        { 
         menus = DataAccess.Menus.FindByExp(x => x.IsDeleted == false && x.MenuName != "NEW Quoting Tool").ToList(); 
        } 
       return menus; 
     } 

我不知道如何改變最後一點,使它看起來通過菜單列表,並根據用戶類型的從「管理」到「我的檔案」更改菜單的名稱。

+0

您不需要將其轉換爲LINQ。如果您使用Entity Framework 6+,則可以將其直接掛接到存儲過程。在6之前,還有其他更復雜的方式來從sproc獲取信息。 – krillgar

+0

我原來是這麼做的,導致決定存儲過程需要被廢除。 –

+0

啊,呃。大多數情況下,情況並非如此,人們並沒有意識到你可以做到這一點。 – krillgar

回答

1

如果我正確地理解你,這是一種方法。

menus = (from p in DataAccess.Menus 
       where p.usertype == 'A' 
       select new tblMenu 
      { //your properties except name 
       Name="My Profile" 
      }).Union(from p in DataAccess.Menus 
        where p.usertype != "A" 
        select p).ToList(); 

根據需要更改usertype條件。在這個linq中,我從DataAccess.Menus獲取所有元素,如果用戶類型是A,那麼我按照您的要求更改一個屬性。然後,我加入了與所有其他元素不匹配的結果usertype