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

时间:2016-08-08 19:49:39

标签: c# linq linq-to-entities asp.net-mvc-5

在我的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'的常量值。在此上下文中仅支持基本类型或枚举类型。”

我最好的猜测是表达式没有在包含查询上返回一个布尔值,尽管我不知道为什么会出现这种情况。您可以提供任何帮助。

谢谢!

1 个答案:

答案 0 :(得分:1)

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

解决方案是准备和使用原始类型的集合(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);