2012-05-23 32 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參數大概對應於您序列中元素的字段名稱,而不是序列本身的字段名稱。因此,您需要在每個元素(分配給x參數)上的泛型類型TGetValue上調用GetField

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