我正在尝试找到实现可以获取数据的服务方法的最佳方法,并且消费者必须有选项来指定必须对结果进行排序的coumnname。
[OperationContract]
void GetAllMoviesSorted();
public List<MovieData> GetAllMoviesSorted()
{
return db.GetAllData();
}
我认为选项是将列名枚举作为参数传递给函数并构建动态查询。这是实现这个的最佳方式吗?
此致 Jebli。
答案 0 :(得分:0)
您可以将lambda表达式传递给Wcf服务,以便查询数据和排序数据。 消费者可以创建排序表达式并将其传递给Wcf服务。
Configuring WCF Data Services using Lambda Expressions
答案 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; }
}
}