在我的MVC5应用程序中,我正在尝试为列表框填充IEnumerable的SelectListItems,通过简单的查询将“select”属性设置为true。这是代码:
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);
当id为1的用户是与会者但id为2的用户不是。
时,才能找到当没有与会者时,我的代码也可以正常工作。但是,当有一个与会者时,我得到错误:“无法创建类型'SdNet.Models.ApplicationUser'的常量值。在此上下文中仅支持基本类型或枚举类型。”
我最好的猜测是表达式没有在包含查询上返回一个布尔值,尽管我不知道为什么会出现这种情况。您可以提供任何帮助。
谢谢!
答案 0 :(得分: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);