我正在尝试使用实体框架构建我的第一个 MVC 4 应用程序。我正在寻找的只是创建一个下拉列表,将每个选项的值和文本设置为相同的值。
这有效,直到我投入GroupBy()
.
Create.cshtml
@Html.DropDownList("CustomerName",(SelectList)ViewData["companies"]);
票务控制器.cs
ViewBag.companies = new SelectList(oc_db.company.Where(c => c.status == "ACTIVE")
.OrderBy(c => c.name_1)
.GroupBy(c=>c.name_1)
, "name_1", "name_1");
这是我收到的错误:
数据绑定: 'System.Data.Objects.ELinq.InitializerMetadata+Grouping'2[[System.String, mscorlib, 版本=4.0.0.0, 区域性=中性, PublicKeyToken=b77a5c561934e089],[OpsTicketing.Models.company, OpsTicketing, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' 不包含名称为"name_1"的属性。
如果我不使用GroupBy
查询就可以工作,尽管有重复项。
GroupBy
不会提供基础类型的枚举。 它为您提供了IGrouping
对象的枚举,其中包含一个Key
字段(该字段为您提供该组的键值)和一个IEnumerable
接口(允许您迭代该组的成员)。
如果您只需要按顺序排列name_1
值的唯一列表,只需选择该字段并执行Distinct
,然后执行OrderBy
:
ViewBag.companies = new SelectList(oc_db.company.Where(c => c.status == "ACTIVE")
.Select(c=> new {c.name_1})
.Distinct()
.OrderBy(c => c.name_1)
, "name_1", "name_1");
请注意,你可以在没有.Select()
的情况下做到这一点,但你必须为你的company
类定义"相等",这比这个练习的价值更麻烦。 这就是为什么Distinct
以前不起作用的原因——因为你没有定义是什么让两家公司与众不同。
您必须在执行 GroupBy 之前解析查询,您可以通过调用 .ToList()
使用 .区别()?http://msdn.microsoft.com/en-us/library/bb348436.aspx
如果这就是您所需要的,应该可以工作。
您是否使用分组只是为了使列表与众不同? 如果是这样,请尝试:
.Where(c => c.status == "ACTIVE")
.OrderBy(c => c.name_1)
.Distinct()