«Не удается неявно преобразовать тип ‘System.Коллекции.Общий.IEnumerableРазрешение>’ в ‘bool'».

#c# #asp.net-mvc #linq

#c# #asp.net-mvc #linq

Вопрос:

Я пытаюсь закодировать начальный экран так, чтобы данный пользователь видел параметры меню в зависимости от их разрешений. В принципе, просматривая каждый пункт меню, просматривая, какие разрешения необходимы для его просмотра, а затем проверяя, есть ли у текущего пользователя какие-либо из этих разрешений.

Я пытаюсь использовать эти строки кода в домашнем действии

 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 amp;amp; x.PermissionName.ToLower() == y.PermissionName.ToLower())
        {
            return true;
        }
        else
        {
            return false;
        };
    }

    public int GetHashCode(Permission obj)
    {
        return obj.Id.GetHashCode();
    }
}
  

Однако во время выполнения я получаю эти ошибки :

Не удается неявно преобразовать тип ‘System.Коллекции.Общий.IEnumerable’ в ‘bool’.

Невозможно преобразовать лямбда-выражение в предполагаемый тип делегата, поскольку некоторые из возвращаемых типов в блоке неявно преобразуются в возвращаемый тип делегата.

Чего мне не хватает?

Комментарии:

1. В вашем предложении where не указано, что должно быть возвращено. Это должно быть что-то вроде: .Where(mo => mo.Permissions.Intersect(userPermissionList, new PermissionComparer()).Count() > 0);

2. Или другую логику, которая объединяет опции меню с разрешениями пользователя. Я не знаю, какова ваша предполагаемая логика между этими двумя объектами.

3. @RickWolff, ваш комментарий сработал лучше всего для меня. Не могли бы вы переместить его в раздел ответов, чтобы я мог его принять?

Ответ №1:

В вашем предложении where не указано, что должно быть возвращено. Это должно быть что-то вроде:

 .Where(
  mo => mo.Permissions.Intersect(userPermissionList, new PermissionComparer()).Count() > 0);
  

Или другую логику, которая объединяет опции меню с разрешениями пользователя. Я не знаю, какова ваша предполагаемая логика между этими двумя объектами.

Ответ №2:

 mo.Permissions.Intersect(userPermissionList, new PermissionComparer()) 
  

возвращает IEnumerable, но где требуется логическая логика.

Ответ №3:

Intersect возвращает все совпадающие элементы между двумя коллекциями. Я думаю, вы просто хотите Contains :

 List<MenuOption> optionList = context.MenuOptions.Where(mo => userPermissionList.Contains(mo.Permissions, new PermissionComparer()));