MVC5:通过 LINQ 查询将 "Selected" 属性 设置为 true

MVC5: Setting "Selected" property to true via a LINQ query

在我的 MVC5 应用程序中,我试图为列表框填充 SelectListItems 的 IEnumerable,通过简单查询将 "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 的用户不是时,这才有效。

我的代码在没有与会者的情况下也能正常工作。但是,即使只有一名与会者,我也会收到错误消息:"Unable to create a constant value of type 'SdNet.Models.ApplicationUser'. Only primitive types or enumeration types are supported in this context."

我最好的猜测是表达式没有在 contains 查询中返回布尔值,尽管我不知道为什么会这样。如果您能提供任何帮助,我们将不胜感激。

谢谢!

错误消息告诉您 EF 无法处理 attendees.Contains(c) 条件,因为 attendees 不是 primitive/enum 类型的集合。

解决方案是准备并使用原始类型的集合(intstringGuid等,通常是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);