2014-06-15 31 views
0

我正試圖找到實現可以獲取數據的服務方法的最佳方法,而且消費者必須有選項來指定coumnname,其中結果必須進行排序。WCF操作合同 - 獲得任何列排序結果的最佳方法

[OperationContract] 
void GetAllMoviesSorted(); 

public List<MovieData> GetAllMoviesSorted() 
{ 
    return db.GetAllData(); 
} 

我想過的選擇是將列名稱enum作爲參數傳遞給函數並構建動態查詢。這是實施這個最好的方法嗎?

Regards, Jebli。

+0

爲什麼不在客戶端提取數據後進行排序? – Pantelis

+0

要求是在服務端做。我相信應該有更好的選擇。最簡單的認爲我可以做的就是編寫基於列名的排序LINQ查詢。 – Rad

回答

0

我已經找到了一個更簡單的方法,而無需使用表達式目錄樹

PropertyInfo pi = typeof(MovieData).GetProperty(orderbycolumn); 
values.OrderBy(x => pi.GetValue(x, null)); 

請找到下面的示例代碼。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Reflection; 

namespace sfPerformance 
{ 
    class MoviesDynamicOrderBy 
    { 
     static void Main(string[] args) 
     { 
      IQueryable<MovieData> MovieNameList = new List<MovieData>() { 
      new MovieData {Name = "Star Wars" , Rating = 7, Language = "Hollywood"}, 
      new MovieData {Name = "The Godfather" , Rating = 7, Language = "Hollywood"}, 
      new MovieData {Name = "The Lord Of The Rings" , Rating = 8, Language = "Hollywood"}, 
      new MovieData {Name = "Titanic" , Rating = 10, Language = "Hollywood"}, 
      new MovieData {Name = "Gone With The Wind" , Rating = 9, Language = "Hollywood"}    
      }.AsQueryable(); 

      //Ascending default 
      MoviesDynamicOrderBy obj = new MoviesDynamicOrderBy(); 
      var result = obj.StudentOrderByColumn<MovieData>("Name", MovieNameList); 

      foreach (var item in result) 
      { 
       Console.WriteLine(item.Name); 
      } 

      Console.WriteLine(Environment.NewLine); 

      //Descending 
      var descendingResult = obj.StudentOrderByColumn<MovieData>("Name", MovieNameList, true); 

      foreach (var item in descendingResult) 
      { 
       Console.WriteLine(item.Name); 
      } 

      if (System.Diagnostics.Debugger.IsAttached) 
       Console.Read(); 
     } 

     public IOrderedQueryable<MovieData> StudentOrderByColumn<T>(string orderbycolumn, IQueryable<MovieData> values, bool isDescending = false) 
     { 
      PropertyInfo pi = typeof(MovieData).GetProperty(orderbycolumn); 
      IOrderedQueryable<MovieData> sortedMovies; 
      if(isDescending) 
      sortedMovies = values.OrderByDescending(x => pi.GetValue(x, null)); 
      else 
      sortedMovies = values.OrderBy(x => pi.GetValue(x, null)); 

      return sortedMovies; 
     } 
    } 

    public class MovieData 
    { 
     public string Name { get; set; } 
     public int Rating { get; set; } 
     public string Language { get; set; } 
    } 
} 
0

如果列排序是MovieData類屬性:

public List<MovieData> getAllMoviesSorted(string column) 
{ 
    List<MovieData> movieData = db.GetAllData(); 
    switch(column.ToUpper()) 
    { 
     case "ORDERDATE": 
      movieData = movieData.OrderBy(o=>o.OrderDate).ToList(); 
      break; 
     // add more cases 
     default: 
      throw new Exception("Column " + column + " cannot be found.");  
    } 
    return movieData; 
} 
0

認爲我會做一個@盧卡斯答案的通用反思版本。

public List<MovieData> getAllMoviesSorted(string column) 
{ 
    List<MovieData> movieData = db.GetAllData(); 
    var parameter = Expression.Parameter(typeof(MovieData)); 
    var lambda = Expression.Lambda(
        Expression.PropertyOrField(parameter, column), 
        parameter); 
    return movieData 
      .AsQueryable() 
      .OrderBy(lambda) 
      .ToList(); 
} 
+0

謝謝阿隆。這是我期待的。 – Rad

相關問題