将用户分配给某个项目时,我想将可用用户列表限制为具有"项目经理"角色的人员。我可以在语法方面使用一些帮助,因为我似乎无法为 Where 方法获得正确的 LINQ 语法。
创建操作 (获取(
// This is the unfiltered version
ViewBag.AssignedToId = new SelectList(db.Users, "Id", "FullName");
// Attempt to filter
ViewBag.AssignedToId= new SelectList(db.Users.Where(c => c.Roles.Contains("Project Manager")), "Id", "FullName");
创建视图
<div class="form-group">
@Html.LabelFor(model => model.AssignedToId, "Choose a Project Manager", htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownList("AssignedToId", null, htmlAttributes: new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.AssignedToId, "", new { @class = "text-danger" })
</div>
</div>
我在下拉列表中收到错误,说
无法比较类型为"System.Collections.Generic.ICollection"的元素。仅支持基元类型、枚举类型和实体类型。
假设这是您正在使用的实体框架,您会注意到 db。用户的类型是 DbSet,而 db。Users.Where(...( 的类型为 IQueryable。我应该想象,如果你添加.ToList((,如下所示:
ViewBag.AssignedToId= new SelectList(db.Users.Where(c => c.Roles.Contains("Project Manager")).ToList(), "Id", "FullName");
如果Roles
是一个集合,那么我建议在 LINQ to Entities 查询之外创建"Project Manager"
列表。 此外,创建一个const string
变量来保存"Project Manager"
魔术字符串。 这将使您不必在使用该字符串的每个位置更改该字符串(如果该字符串要更改(。
public const string roleProjectManager = "Project Manager";
var lstProjectManagers = db.Users.Where(x => x.Roles.Contains(roleProjectManager)).ToList();
然后创建您的选择列表。
ViewBag.AssignedToId= new SelectList(lstProjectManagers, "Id", "FullName");
让我知道这是否有帮助!
我的问题的解决方案是在控制器创建操作 (GET( 中包含以下代码:
var role = db.Roles.SingleOrDefault(u => u.Name == "Project Manager");
var usersInRole = db.Users.Where(u => u.Roles.Any(r => (r.RoleId == role.Id)));
ViewBag.AssignedId = new SelectList(usersInRole, "Id", "FullName");
而不是:
ViewBag.AssignedToId = new SelectList(db.Users, "Id", "FullName");
然后将其包含在创建视图中:
<div class="form-group">
@Html.LabelFor(model => model.AssignedToId, "Choose a Project Manager", htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.DropDownListFor(Model => Model.AssignedToId, ViewBag.AssignedId as SelectList, null, htmlAttributes: new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.AssignedToId, "", new { @class = "text-danger" })
</div>
</div>
替换此下拉列表列表:
@Html.DropDownList("AssignedToId", null, htmlAttributes: new { @class = "form-control" })