0

我有一些問題LINQ和莫比別人得到的答案用好LINQ查詢與字符串[]

string[] roleNames = Roles.GetRolesForUser(currentUserName); 


result = context.MenuRoles.Select(mr => new MenuGenerateViewModel 
{ 
    MenuID = mr.MenuID, 
    MenuNazwa = mr.Menu.MenuNazwa, 
    MenuKolejnosc = mr.Menu.MenuKolejnosc, 
    MenuStyl = mr.Menu.MenuStyl, 
    MenuParentID = mr.Menu.MenuParentID, 
    MenuActive = mr.Menu.MenuActive, 
    MenuActionName = mr.Menu.MenuAction.MenuActionName, 
    MenuControlName = mr.Menu.MenuControl.MenuControlName, 
    RoleName = mr.Role.RoleName, 
    RoleID = mr.RoleID, 
    MenuID = mr.MenuID 
}) 
.Where(mr => mr.MenuActive == true) 
.ToList(); 

如何只需要比較的String []角色名且僅當比賽恢復。問題alwais是當用戶處於2個或更多角色時。

的Tx答案

+1

不清楚你想要做什麼! – Jamiec

+0

我必須將所有分配給用戶具有的角色的菜單取下來! –

回答

2

如果我明白你問什麼,添加第二個條件,你Where條款:

 .Where(mr => mr.MenuActive && roleNames.Contains(mr.Role.RoleName)) 
+0

聰明! ......但是還有一個小問題,如果你爲你所屬的各種角色分配相同的菜單,菜單會出現兩次。它如何排除? –

+0

要過濾掉重複項,請在'.ToList()'之前調用'.Distinct'。但爲了達到此目的,您需要實現並指定一個'IEqualityComparer '。請參閱http://msdn.microsoft.com/en-us/library/bb338049.aspx – Clafou

1

你會好起來的開關圓你Where條款和Select爲簡單的原因,那麼你將不會從數據庫檢索不需要的記錄。

result = context.MenuRoles.Where(mr => mr.MenuActive 
        && roleNames.Contains(mr.Role.RoleName)) 
       .Select(mr => ...) 
       .ToList(); 

這將產生,而不是選擇整幅和然後過濾它一個SQL僅選擇必要的記錄。嘗試一下並觀察SQL分析器以查看差異(使用EF時的任何情況下的有用技能)

+0

是的,我需要開始使用這個想法:P –

0

在這裏的輝煌人士的幫助下,達到了目標。

string[] roleNames = Roles.GetRolesForUser(currentUserName); 


result = context.MenuRoles 
    .Where(mr => mr.Menu.MenuActive && roleNames.Contains(mr.Role.RoleName)) 
    .Select(mr => new MenuGenerateViewModel 
    { 
     MenuID = mr.MenuID, 
     MenuNazwa = mr.Menu.MenuNazwa, 
     MenuKolejnosc = mr.Menu.MenuKolejnosc, 
     MenuStyl = mr.Menu.MenuStyl, 
     MenuParentID = mr.Menu.MenuParentID, 
     MenuActive = mr.Menu.MenuActive, 
     MenuActionName = mr.Menu.MenuAction.MenuActionName, 
     MenuControlName = mr.Menu.MenuControl.MenuControlName, 
     RoleName = mr.Role.RoleName 
    }) 
    .ToList(); 

var userresult = context.MenuUsers 
    .Where(mr => mr.Menu.MenuActive && mr.User.Username == currentUserName) 
    .Select(mr => new MenuGenerateViewModel 
    { 
     MenuID = mr.MenuID, 
     MenuNazwa = mr.Menu.MenuNazwa, 
     MenuKolejnosc = mr.Menu.MenuKolejnosc, 
     MenuStyl = mr.Menu.MenuStyl, 
     MenuParentID = mr.Menu.MenuParentID, 
     MenuActive = mr.Menu.MenuActive, 
     MenuActionName = mr.Menu.MenuAction.MenuActionName, 
     MenuControlName = mr.Menu.MenuControl.MenuControlName, 
     Username = mr.User.Username 
    }) 
    .ToList(); 

這裏,得到所有你有合適的,均通過組成員,並直接分配到菜單本身的菜單。

// Kick all duplicates 
var noduplicates = result.Concat(userresult) 
          .Distinct(new RoleMenuGenerateComparer()); 

因爲通常我們不希望菜單中有重複項,所以我們刪除它們。爲了這個正常工作,我們需要實現的IEqualityComparer(U可以讀到這一點上)

public class RoleMenuGenerateComparer : IEqualityComparer<MenuGenerateViewModel> 
{ 

    public bool Equals(MenuGenerateViewModel x, MenuGenerateViewModel y) 
    { 
     //Check whether the compared objects reference the same data. 
     if (Object.ReferenceEquals(x, y)) return true; 

     //Check whether any of the compared objects is null. 
     if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null)) 
      return false; 

     //Check whether the products' properties are equal. 
     return x.MenuNazwa == y.MenuNazwa && x.MenuID == y.MenuID; 
    } 

    public int GetHashCode(MenuGenerateViewModel menuGenerateViewModel) 
    { 
     if (Object.ReferenceEquals(menuGenerateViewModel, null)) return 0; 

     int hashMenuName = menuGenerateViewModel.MenuNazwa == null ? 0 : menuGenerateViewModel.MenuNazwa.GetHashCode(); 

     int hashMenuID = menuGenerateViewModel.MenuID == null ? 0 : menuGenerateViewModel.MenuID.GetHashCode(); 

     return hashMenuName^hashMenuID; 

    } 

} 

當然,我相信,你可以優化這段代碼,但目前我有這樣的事情。

Tx all for help。