WCF操作契约——获得按任何列排序的结果的最佳方式



我正在努力寻找实现服务方法的最佳方法,该方法可以获得数据,并且消费者必须有选项来指定必须对结果进行排序的商品名。

[OperationContract]
void GetAllMoviesSorted();
public List<MovieData> GetAllMoviesSorted()
{
    return db.GetAllData(); 
}

我认为的选项是传递一个列名enum作为函数的参数,并构建一个动态查询。这是最好的实现方式吗?

问候,Jebli .

如果要排序的列是MovieData class Properties:

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;
}

我想做一个一般反思版本的@Lucas的答案。

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();
}

我发现了一个更简单的方法,不用使用表达式树

 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; }
    }
}

最新更新