Как использовать Аргумент в NewExpression как Expression для использования в методе OrderBy? - PullRequest
0 голосов
/ 24 февраля 2010

Во-первых, я использую C # 4.0 и EF 4.0 с объектом POCO для доступа к базе данных. Далее я создаю некоторую сетку (например, jqGrid) для отображения данных из базы данных через ASP.NET MVC 2.0. Эта сетка может упорядочить данные, нажав на заголовок столбца. Исходный код может выглядеть следующим образом.

// This method will generate data for jqGrid request.
// jqGridRequest contain several options about how to query data like 
//   Take 10 result
//   Skip 50 rows
//   Filter by something
//   Order by column name
public JsonResult GetPeopleData(jqGridRequest req)
{
   // This extension method has 2 parameters that are jqGridRequest and 
   // Expression<Func<T, object>> for creating object to be serialized.
   // In this case, T is People type.       
   return DataContext.People.AsJqGridResult
   (
       req,
       x => new 
       {
           x.ID,
           Name = x.FirstName + " " + x.LastName,
           x.Age
       }
   )
}

Все отлично работает. Вопрос в том, когда я пытаюсь упорядочить столбец «Имя» в этой сетке, jqGrid отправит запрос, который сообщает контроллеру, чтобы упорядочить данные по столбцу «Имя». Однако столбец «Имя» не существует в базе данных, поскольку он представляет собой просто объединенное значение некоторого столбца.

Самым простым для решения этого вопроса является создание кода для выполнения чего-то вроде следующего кода.

DataContext.People.OrderBy(x => x.FirstName + " " + x.LastName);

Однако мне нужно создать какой-нибудь метод для обработки любого простого условия orderby, подобного этому. После того, как я ищу и пробую любые возможности по поводу выражения. Я только что обнаружил, что могу использовать некоторые данные, содержащиеся в NewExpression, чтобы упорядочить этот запрос. Но я не знаю, как преобразовать / создать Аргумент в объекте NewExpression в Expression для использования в качестве параметра метода OrderBy.

Спасибо

1 Ответ

0 голосов
/ 25 февраля 2010

Name не существует в БД, но существует в анонимном типе, на который вы проецируете.

Я не собираюсь пытаться угадать, что делают все ваши методы расширения. Но если вы сделали:

var q = from p in DataContext.People
        select new 
        { 
            Name = p.FirstName + " " + p.LastName
        };

... а затем:

var r = q.OrderBy(p => p.Name);

... тогда это должно "просто работать".

...