WCF操作合同 - 将结果按任何列排序的最佳方法

时间:2014-06-15 13:14:10

标签: c# linq wcf

我正在尝试找到实现可以获取数据的服务方法的最佳方法,并且消费者必须有选项来指定必须对结果进行排序的coumnname。

[OperationContract]
void GetAllMoviesSorted();

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

我认为选项是将列名枚举作为参数传递给函数并构建动态查询。这是实现这个的最佳方式吗?

此致 Jebli。

4 个答案:

答案 0 :(得分:0)

您可以将lambda表达式传递给Wcf服务,以便查询数据和排序数据。 消费者可以创建排序表达式并将其传递给Wcf服务。

Using Expressions in WCF

Configuring WCF Data Services using Lambda Expressions

How can I pass a lambda expression to a WCF service

Expression Tree Serializer

答案 1 :(得分: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;
}

答案 2 :(得分:0)

以为我会做@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();
}

答案 3 :(得分: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; }
    }
}