C# 根据字段从具有关系的单独实体中排序实体列表
我将实体框架用于对象关系映射,将jqGrid用于网格 我有一个员工实体,其中包含一个ContactID字段。我有一个联系人实体,其中包含字段FirstName和LastName 我希望在网格中显示员工列表,并让用户能够按FirstName和LastName进行排序 以下是我现在拥有的: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
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();