2016-08-08 1 views
0

В моем приложении MVC5 я пытаюсь заполнить IEnumerable из SelectListItems для списка, установив для свойства «select» значение true с помощью простого запроса. Вот код:MVC5: Установка свойства «Selected» в true с помощью запроса LINQ

GroupActivity groupActivity = await db.GroupActivities.FindAsync(id); 

ICollection<ApplicationUser> attendees = groupActivity.Attendees; 

IEnumerable<SelectListItem> items = db.Users.Select(c => new SelectListItem 
{ 
    Value = c.Id.ToString(), 
    Text = c.LastName + ", " + c.FirstName, 
    Selected = attendees.Contains(c) 
}) 
.OrderBy(q => q.Text); 

ViewBag.Userlist = items; 

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

ApplicationUser yes = db.Users.First(n => n.Id == 1); 
var x = groupActivity.Attendees.Contains(yes); 

ApplicationUser no = db.Users.First(n => n.Id == 2); 
var y = groupActivity.Attendees.Contains(no); 

Это работало просто найти, когда пользователь с идентификатором 1 является участником, но пользователь с идентификатором-не ,

Мой код также отлично работает, когда нет посетителей. Однако, когда есть даже один участник, я получаю сообщение об ошибке: «Невозможно создать постоянное значение типа« SdNet.Models.ApplicationUser ». В этом контексте поддерживаются только примитивные типы или типы перечислений».

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

Спасибо!

ответ

1

Сообщение об ошибке сообщает, что EF не может обработать условие attendees.Contains(c), потому что attendees не является коллекцией примитивного/перечисляемого типа.

Решение подготовить и использовать коллекцию примитивного типа (int, string, Guid и т.д., как правило, типа PK), как это:

var attendeeIds = groupActivity.Attendees.Select(u => u.Id).ToList(); 
IEnumerable<SelectListItem> items = db.Users.Select(c => new SelectListItem 
{ 
    Value = c.Id.ToString(), 
    Text = c.LastName + ", " + c.FirstName, 
    Selected = attendeeIds.Contains(c.Id) 
}) 
.OrderBy(q => q.Text); 
+0

Спасибо @IvanStoev, работал отлично. – ChemProfMatt