2014-01-17 33 views
1

我正在編寫我的第一個web API控制器,所以我在這方面有點小菜鳥。我想通過一個靜態類稱爲CustomerDataSource檢索數據的列表:爲web API控制器創建排序

public static class CustomerDataSource 
{ 
    public static List<Customer> customerData 
    { 
     get 
     { 
      Customer customer1 = new Customer() { name = "Bert", address = "London" }; 
      Customer customer2 = new Customer() { name = "Jon", address = "New York" }; 
      List<Customer> listCustomers = new List<Customer>(); 
      listCustomers.Add(customer1); 
      listCustomers.Add(customer2); 
      return listCustomers; 
     } 
    } 
} 

public class Customer 
{ 
    public string name { get; set; } 
    public string address { get; set; } 
} 

我有點卡住我的ApiController,因爲我想作爲排序依據「名」或「地址」,但使用該列表或者一個名爲'field'的字符串不能編譯。什麼是WebAPI控制器GETmethod的良好實現,它提供了對其中一個Customer屬性的排序?

public class ValuesController : ApiController 
{ 
    // GET api/values 
    public List<Customer> Get(string field) 
    { 
     var list = CustomerDataSource.customerData.OrderBy(field); 
    } 
} 

回答

5

像下面創建一個擴展方法,那麼您可以在您的項目相同的命名空間內的任何地方使用它。

public static class extensionmethods 
    { 
     public static IQueryable<T> OrderByPropertyName<T>(this IQueryable<T> q, string SortField, bool Ascending) 
     { 
      var param = Expression.Parameter(typeof(T), "p"); 
      var prop = Expression.Property(param, SortField); 
      var exp = Expression.Lambda(prop, param); 
      string method = Ascending ? "OrderBy" : "OrderByDescending"; 
      Type[] types = new Type[] { q.ElementType, exp.Body.Type }; 
      var rs = Expression.Call(typeof(Queryable), method, types, q.Expression, exp); 
      return q.Provider.CreateQuery<T>(rs); 
     } 
    } 

然後你可以使用它像:

public List<Customer> Get(string PropertyName) 
    { 
     var list = CustomerDataSource.customerData.AsQueryable().OrderByPropertyName("PropertyName",true).ToList(); 
    } 

注: 因爲擴展方法使用的IQueryable並返回IQuerybale,所以你需要你的列表轉換爲IQueryable的。您也可以按升序和降序排列列表,只需將布爾類型值傳遞給第二個參數即可。默認值是升序。

+0

這是否會與一個asp.net的Web API工作?該網址應該在屬性名稱中傳遞什麼? – Pindakaas

+0

它適用於任何.Net框架。在你的情況下,URL將會像「api/Values/name」一樣。 – Lin

3

您需要使用lambda表達式。

if (field == "name") 
    var list = CustomerDataSource.customerData.OrderBy(d => d.name); 
else if (field == "address") 
    var list = CustomerDataSource.customerData.OrderBy(d => d.address); 
+0

這將按名稱排序,我想按名稱或地址排序。 – Pindakaas

+0

看我的編輯,你可能還想添加一個默認的其他。 – aw04