使用Linq来引用你用ViewModel实例化的表作为列表来生成'SelectListItems'列表的

本文关键字:列表 SelectListItems 引用 Linq ViewModel 使用 实例化 | 更新日期: 2023-09-27 18:09:42

我想在我的控制器中生成一个强类型的角色列表,以及另外两个列表,它们将在我的视图中用作发送电子邮件的各种过滤器。我知道我可以使用以下命令生成Roles列表:

var viewModel = new ListViewModel
        {
            Roles = db.Roles.OrderBy(r => r.Name).ToList().Select(rr => new SelectListItem { Value = rr.Id.ToString(), Text = rr.Name }).ToList(),
        };

然而,由于我也想传递两个其他列表到我的控制器,我更愿意通过以以下方式编写查询来获得角色列表:

var viewModel = db.Roles
           .Select(x => new SendGroupEmailViewModel
           {
               Roles = x.Select(rr => new SelectListItem { Value = rr.Id.ToString(), Text = rr.Name }).ToList(),
           };

这样我就可以获得我的其他两个列表作为同一查询的一部分,而不是以前的方法,他们必须有效地独立查询数据库。显然,上面的内容不起作用,我无法在角色表上通过编写Roles = x.Select.

我的问题是,为什么我不能这样做,什么是正确的方式来查询角色表时,写它类似于上面的方式?

只是为了清楚,它必须是var viewModel = db的原因。角色是因为无论出于何种原因,我都无法访问ID/名称角色列表,否则由于身份如何在MVC中设置。我知道还有其他方法可以获得列表,我只是想知道这种具体的方法是如何实现的?

编辑-我应该在我的viewModel中添加角色如下:

public IEnumerable<SelectListItem> Roles { get; set; }

使用Linq来引用你用ViewModel实例化的表作为列表来生成'SelectListItems'列表的

controller

var oList = db.Roles.Select(x => new SendGroupEmailViewModel
               {
                   Roles = x.Roles.Select(rr => new SelectListItem { Value = rr.Id.ToString(), Text = rr.Name }).ToList();
    ViewData.myList = new SelectList(oList,
               }, 
                    "Value", "Text", 15); // 15 = selected item or you can omit this value
视图

<%=Html.DropDownList("myList") %>