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