C# 根据字段从具有关系的单独实体中排序实体列表

C# 根据字段从具有关系的单独实体中排序实体列表,c#,asp.net,asp.net-mvc,jqgrid,C#,Asp.net,Asp.net Mvc,Jqgrid,我将实体框架用于对象关系映射,将jqGrid用于网格 我有一个员工实体,其中包含一个ContactID字段。我有一个联系人实体,其中包含字段FirstName和LastName 我希望在网格中显示员工列表,并让用户能够按FirstName和LastName进行排序 以下是我现在拥有的: public JsonResult GridData(string sidx, string sord, int page, int rows) { var pageIndex = Convert.ToI

我将实体框架用于对象关系映射,将jqGrid用于网格

我有一个员工实体,其中包含一个ContactID字段。我有一个联系人实体,其中包含字段FirstName和LastName

我希望在网格中显示员工列表,并让用户能够按FirstName和LastName进行排序

以下是我现在拥有的:

public JsonResult GridData(string sidx, string sord, int page, int rows)
{
    var pageIndex = Convert.ToInt32(page) - 1;
    var pageSize = rows;
    var totalRecords = GetAllEmployees().Count();
    var totalPages = (int)Math.Ceiling(totalRecords / (float)pageSize);

    IQueryable<Employee> employees = GetAllEmployees().
                                          OrderBy(sidx + " " + sord).
                                          Skip(pageIndex * pageSize).
                                          Take(pageSize).ToArray();

    ...
}
publicjsonresult GridData(字符串sidx、字符串sord、int页、int行)
{
var pageIndex=Convert.ToInt32(第页)-1;
var pageSize=行;
var totalRecords=GetAllEmployees().Count();
var totalPages=(int)数学上限(totalRecords/(float)pageSize);
IQueryable employees=GetAllEmployees()。
OrderBy(sidx+“”+sord)。
跳过(页面索引*页面大小)。
Take(pageSize.ToArray();
...
}
正如您所看到的,这只允许我在Employee实体中按字段排序,因此我不能按FirstName和LastName排序


如何修改此项以实现此目的?

如果没有其他选项,则必须使用包含这些字段的投影,它可能类似于:

GetAllEmployees()
.Select( e => new { 
                    Person = e, 
                    Contact = Contacts.Where( c=> c.Id == e.ContactID).Single() 
                  })
.OrderBy( x => x.Contact.LastName)
.Select( x => x.Person) //back to Employee
.Skip(...)
.Take(...)
这不是非常有效,因为您必须查询每个员工的
联系人
实体集(所以n个查询!)-因此我建议修改初始Linq to Entities查询,以返回员工及其关联联系人的列表,这可以通过加入来完成,即
GetEmployeesWithContact()

最好的Linq to Entities样式解决方案是在加载员工时对联系人执行以下操作:

var emps = Employees.Include("Contact");
现在,
emps
中的每个员工都有一个
Contact
属性,您可以在投影中使用该属性:

IQueryable<Employee> employees = emps.OrderBy(x=> x.Contact.LastName)
                                     .Skip(pageIndex * pageSize).
                                     .Take(pageSize).ToArray();
IQueryable employees=emps.OrderBy(x=>x.Contact.LastName)
.Skip(页面索引*页面大小)。
.Take(pageSize.ToArray();