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。