2011-03-06 2 views
0

내 객체 - 관계 매핑에 Entity Framework를 사용하고 그리드에 jqGrid를 사용하고 있습니다.관계가있는 별도 엔티티의 필드를 기반으로 엔티티 목록을 주문하십시오.

나는 직원 엔티티이며, 여기에 ContactID 필드가 있습니다. 나는 필드에 FirstName과 LastName 필드가있는 연락처를 가지고 있습니다.

그리드에 Employees 목록을 표시하고 이름 및 성으로 정렬 할 수있는 권한을 사용자에게 부여하려고합니다. 이것은 단지 나에게 직원 개체의 필드를 기준으로 정렬 할 수있는 기능을 제공,

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이 될 것입니다. 들 당신은 종업원을로드 할 때 :

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

지금 emps의 각 직원은 당신이 당신의 투사에서 사용할 수있는 Contact 등록을해야합니다
관련 문제