&#34;无法隐式转换类型&#39; System.Collections.Generic.IEnumerable <c3s.models.permission>&#39; to&#39; bool&#39;。&#34;

时间:2016-10-06 14:25:43

标签: c# asp.net-mvc linq

我尝试编写主屏幕代码,以便给定用户根据其权限查看菜单选项。基本上,浏览每个菜单选项,查看需要查看的权限,然后检查当前用户是否具有这些权限。

我在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表达式转换为预期的委托类型,因为   块中的某些返回类型不可隐式转换   到委托的返回类型。

我错过了什么?

3 个答案:

答案 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()));