我尝试编写主屏幕代码,以便给定用户根据其权限查看菜单选项。基本上,浏览每个菜单选项,查看需要查看的权限,然后检查当前用户是否具有这些权限。
我在Home Action
中尝试使用这些代码行var userPermissionList = currentUser.Permissions;
List<MenuOption> optionList = context.MenuOptions.Where(mo => mo.Permissions.Intersect(userPermissionList, new PermissionComparer()));
我的IEqualityComparer的实现:
public bool Equals(Permission x, Permission y)
{
if (x.Id == y.Id && x.PermissionName.ToLower() == y.PermissionName.ToLower())
{
return true;
}
else
{
return false;
};
}
public int GetHashCode(Permission obj)
{
return obj.Id.GetHashCode();
}
}
但是,在运行时,我收到了以下错误:
无法隐式转换类型 &#39; System.Collections.Generic.IEnumerable&#39;至 &#39;布尔&#39;
无法将lambda表达式转换为预期的委托类型,因为 块中的某些返回类型不可隐式转换 到委托的返回类型。
我错过了什么?
答案 0 :(得分:2)
你的where子句并没有说应该返回什么。它应该是这样的:
.Where(
mo => mo.Permissions.Intersect(userPermissionList, new PermissionComparer()).Count() > 0);
或将MenuOptions与用户的权限相结合的另一种逻辑。我不知道这两个对象之间的逻辑是什么。
答案 1 :(得分:1)
mo.Permissions.Intersect(userPermissionList, new PermissionComparer())
返回一个IEnumerable,但Where需要布尔逻辑。
答案 2 :(得分:1)
Intersect
返回两个集合之间的所有匹配项。我想你只想要Contains
:
List<MenuOption> optionList = context.MenuOptions.Where(mo => userPermissionList.Contains(mo.Permissions, new PermissionComparer()));