2012-05-23 2 views
0

Я пытаюсь сделать метод заказа запроса в классе, который я сделал.Закажите запрос, используя метод класса

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

public static void Ordenar<T>(IEnumerable<T> query, string columna, string orden) 
    { 
     if (!(String.IsNullOrEmpty(orden) || String.IsNullOrEmpty(columna))) 
     { 
      if (orden == "ASC") query.OrderBy(x => x.GetType().GetField(columna).GetValue(query)); 
      if (orden == "DESC") query.OrderByDescending(x => x.GetType().GetField(columna).GetValue(query)); 
     } 
    } 

безрезультатно. Я не могу управлять, чтобы заставить его работать так:

db.Thingys.OrderBy(x=> x.Name); 

Как можно «выбрать» это поле я хочу заказать запрос, в общем? Пожалуйста, помогите. D: Я использую ASP.NET MVC3

+0

Извините за то, что вы медлите, но что не так с методами LINQ 'OrderBy' и' OrderByDescending'? Зачем вам нужна специальная версия? –

+0

Когда вы говорите, что это не сработает, вы имеете в виду использование точного кода выше? Ваш метод не возвращает последовательность «запрос». Вы ожидали, что он будет заказан так, как будто «по ссылке»? Это не произойдет с IEnumerable. – mdisibio

+0

Я пытаюсь заказать запрос по шаблону, который я передаю по параметру. Я не знал, что его невозможно заказать «по ссылке». Во всяком случае, этот метод не работает: запрос не упорядочивается, даже до завершения метода. – Umagon

ответ

1

Не вдаваясь в (например, для данных, вводимых пользователем.) необходимо ли сделать это , вот некоторые ошибки, которые были с вашим кодом.

Во-первых, вам необходимо указать результат запроса LINQ. Операторы LINQ не изменяют исходную последовательность.

Во-вторых, параметр columna предположительно соответствует названию поля элементов в вашей последовательности, а не самой последовательности. Таким образом, вам нужно позвонить GetField на общий тип T и GetValue на каждый элемент (в соответствии с параметром x).

public static IEnumerable<T> Ordenar<T>(IEnumerable<T> query, 
    string columna, string orden) 
{ 
    if (!(String.IsNullOrEmpty(orden) || String.IsNullOrEmpty(columna))) 
    { 
     FieldInfo orderField = typeof(T).GetField(columna); 

     if (orden == "ASC") 
      return query.OrderBy(x => orderField.GetValue(x)); 

     if (orden == "DESC") 
      return query.OrderByDescending(x => orderField.GetValue(x)); 
    } 

    return query; 
} 
+0

Это то, что я искал, спасибо. – Umagon