2011-03-06 81 views
0

我对我的对象关系映射使用实体框架,对我的网格使用jqGrid。根据来自单独实体的字段来订购实体列表

我有一个雇员实体,它包含一个ContactID字段。我有一个联系人包含字段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(); 

    ... 
} 

正如你所看到的,这只是让我在员工实体字段进行排序的能力,所以我不能排序名字和姓氏。

我该如何修改这个来实现这个目标?

回答

0

如果你将不得不使用的投影,包括这些领域没有其他的选项,这可能是这样的:

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(...) 

这不是非常有效的,因为你必须查询Contacts实体为每个员工设置(所以n查询!) - 所以我会建议修改初始Linq到实体查询返回给你一个员工列表与他们的关联联系人,这可以通过加入完成,即GetEmployeesWithContact()

最好的Linq to Entities风格的解决方案是include Contact ■当您加载雇员:

var emps = Employees.Include("Contact"); 

现在emps每个员工都会有Contact属性,你可以在你的投影使用方法:

IQueryable<Employee> employees = emps.OrderBy(x=> x.Contact.LastName) 
            .Skip(pageIndex * pageSize). 
            .Take(pageSize).ToArray();