Я решил проблему, с которой я столкнулся, но хотя я узнал, как что-то работает (или нет), я не понимаю, почему.Linq/Enumerable Any Vs Содержит
Как я тип человека, который любит, чтобы знать «почему» я надеюсь, что кто-то может объяснить:
У меня есть список элементов и связанных с ними комментарии, и я хотел провести различие между комментариями и администратора комментарии пользователей, поэтому я попытался следующий код:
User commentUser = userRepository.GetUserById(comment.userId);
Role commentUserRole = context.Roles.Single(x=>x.Name == "admin");
if(commentUser.Roles.Contains(commentUserRole)
{
//do stuff
}
else
{
// do other stuff
}
Stepping через код показал, что, хотя он был правильный объект Role, он не признает роль в commentUser.Roles
код, в конечном итоге работал:
if(commentUser.Roles.Any(x=>x.Name == "admin"))
{
//do stuff
}
Я доволен этим, потому что это меньше кода и, по-моему, более чистым, но я не понимаю, как он не работает.
Надеясь, что кто-то может очистить это для меня.
Я не 't получить его - это не User.Roles список объектов Role? – richardterris
Поскольку он не использовал '==' между объектом Role, неважно, перегрузил ли он 'operator ==', но вы правы в переопределении 'Equals' и' GetHashCode'. –
@richardterris Все дело в том, как ваш объектный контекст имеет дело со вторым запросом для того же объекта. Похоже, что поведение состоит в том, чтобы создать новый объект, а не возвращать уже запрошенный объект. Это означает, что, несмотря на то, что все значения свойств выходят одинаково, они фактически являются разными объектами и без переопределения равенства значение возвращает false. –