#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()));