Заказать список объектов на основе поля из отдельного объекта со связью - PullRequest
0 голосов
/ 07 марта 2011

Я использую Entity Framework для моего объектно-реляционного отображения и jqGrid для моей сетки.

У меня есть объект Employee , который содержит поле 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();

    ...
}

Как видите, это только дает мне возможность сортировать по полям в сущности Employee, поэтому я не могу сортировать по FirstName и LastName.

Как я могу изменить это, чтобы достичь этого?

1 Ответ

0 голосов
/ 07 марта 2011

Если нет другого варианта, вам придется использовать проекцию, которая включает эти поля, это может быть что-то вроде:

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 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...