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