Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 为web API控制器创建排序列表_C# 4.0_Asp.net Web Api - Fatal编程技术网

C# 4.0 为web API控制器创建排序列表

C# 4.0 为web API控制器创建排序列表,c#-4.0,asp.net-web-api,C# 4.0,Asp.net Web Api,我正在编写我的第一个web API控制器,所以我在这方面有点不在行。我试图通过名为CustomerDataSource的静态类检索数据列表: public static class CustomerDataSource { public static List<Customer> customerData { get { Customer customer1 = new Customer() { name = "

我正在编写我的第一个web API控制器,所以我在这方面有点不在行。我试图通过名为CustomerDataSource的静态类检索数据列表:

public static class CustomerDataSource
{
    public static List<Customer> customerData
    {
        get
        {
            Customer customer1 = new Customer() { name = "Bert", address = "London" };
            Customer customer2 = new Customer() { name = "Jon", address = "New York" };
            List<Customer> listCustomers = new List<Customer>();
            listCustomers.Add(customer1);
            listCustomers.Add(customer2);
            return listCustomers;
        }
    }
}

public class Customer
{
    public string name { get; set; }
    public string address { get; set; }
}
公共静态类CustomerDataSource
{
公共静态列表customerData
{
得到
{
Customer customer1=新客户(){name=“Bert”,address=“London”};
Customer customer2=new Customer(){name=“Jon”,address=“new York”};
List listCustomers=新列表();
listCustomers.Add(customer1);
listCustomers.Add(customer2);
退回客户名单;
}
}
}
公共类客户
{
公共字符串名称{get;set;}
公共字符串地址{get;set;}
}
我有点被ApiController卡住了,因为我试图按“name”或“address”对列表排序,但使用名为“field”的字符串无法编译。WebAPI控制器GETmethod提供了对客户属性之一进行排序的好实现是什么

public class ValuesController : ApiController
{
    // GET api/values
    public List<Customer> Get(string field)
    {
        var list = CustomerDataSource.customerData.OrderBy(field);
    }
}
公共类值控制器:ApiController
{
//获取api/值
公共列表获取(字符串字段)
{
var list=CustomerDataSource.customerData.OrderBy(字段);
}
}

您需要使用lambda表达式

if (field == "name")
    var list = CustomerDataSource.customerData.OrderBy(d => d.name);
else if (field == "address")
    var list = CustomerDataSource.customerData.OrderBy(d => d.address);

创建一个如下所示的扩展方法,然后可以在项目中同一命名空间内的任何位置使用它

public static class extensionmethods
    {
        public static IQueryable<T> OrderByPropertyName<T>(this IQueryable<T> q, string SortField, bool Ascending)
        {
            var param = Expression.Parameter(typeof(T), "p");
            var prop = Expression.Property(param, SortField);
            var exp = Expression.Lambda(prop, param);
            string method = Ascending ? "OrderBy" : "OrderByDescending";
            Type[] types = new Type[] { q.ElementType, exp.Body.Type };
            var rs = Expression.Call(typeof(Queryable), method, types, q.Expression, exp);
            return q.Provider.CreateQuery<T>(rs);
        }
    }
公共静态类扩展方法
{
公共静态IQueryable OrderByPropertyName(此IQueryable q,字符串SortField,bool升序)
{
var param=表达式参数(类型(T),“p”);
var prop=Expression.Property(param,SortField);
var exp=表达式Lambda(prop,param);
string方法=升序?“OrderBy”:“OrderByDescending”;
类型[]类型=新类型[]{q.ElementType,exp.Body.Type};
var rs=Expression.Call(typeof(Queryable),方法,类型,q.Expression,exp);
返回q.Provider.CreateQuery(rs);
}
}
然后你可以像这样使用它:

 public List<Customer> Get(string PropertyName)
    {
        var list = CustomerDataSource.customerData.AsQueryable().OrderByPropertyName("PropertyName",true).ToList();
    }
公共列表获取(字符串属性名称)
{
var list=CustomerDataSource.customerData.AsQueryable().OrderByPropertyName(“PropertyName”,true).ToList();
}
注:
因为扩展方法使用IQueryable并返回IQuerybale,所以需要将列表转换为IQueryable。您还可以按升序和降序排列列表,只需将布尔类型值传递给第二个参数。默认值为升序。

这将按名称排序,我想按名称或地址排序。请参阅我的编辑,您可能还想添加默认值。这是否适用于asp.net web API?url应该在propertyname中传递什么?它可以在任何.Net框架中工作。在您的情况下,URL类似于“api/Values/name”。