我正在尝试使用实体框架构建我的第一个MVC 4应用程序。我正在寻找的是创建一个下拉列表,其中每个选项的值和文本设置为相同的值。
这是有效的,直到我扔进GroupBy()
。
Create.cshtml
@Html.DropDownList("CustomerName",(SelectList)ViewData["companies"]);
ticketController.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,文化=中性, 公钥= b77a5c561934e089],[OpsTicketing.Models.company, OpsTicketing,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]' 不包含名称为“name_1”的属性。
如果我不使用GroupBy
查询有效,尽管有重复项。
答案 0 :(得分:3)
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
以前不起作用的原因 - 因为你没有定义是什么让两家公司区别开来。
答案 1 :(得分:2)
您必须在执行GroupBy之前解析查询,您可以通过调用.ToList()
答案 2 :(得分:1)
如何使用.Distinct()? http://msdn.microsoft.com/en-us/library/bb348436.aspx
如果这就是你需要的,那就应该有效。
答案 3 :(得分:0)
您是否使用分组只是为了使列表清晰?如果是这样,请尝试:
.Where(c => c.status == "ACTIVE")
.OrderBy(c => c.name_1)
.Distinct()