实体框架ORDER BY问题

时间:2013-01-29 22:43:55

标签: c# linq entity-framework exception-handling sql-order-by

我正在尝试使用实体框架构建我的第一个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查询有效,尽管有重复项。

4 个答案:

答案 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()