2011-03-06 82 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();