【问题标题】:MVC5: Setting "Selected" property to true via a LINQ queryMVC5:通过 LINQ 查询将“Selected”属性设置为 true
【发布时间】:2016-12-14 17:05:53
【问题描述】:

在我的 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;

在调试器中,我已验证与会者确实返回了预期的 ApplicationUser 集合。我还测试了这是否适用于类似这样的个人用户,我得到了预期的布尔结果:

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

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

谢谢!

【问题讨论】:

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


    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-02
      • 1970-01-01
      • 2011-06-14
      • 2021-12-11
      • 2018-05-23
      • 1970-01-01
      相关资源
      最近更新 更多