C# 动态linq OrderBy isn';他不为我工作

C# 动态linq OrderBy isn';他不为我工作,c#,linq,sorting,odata,C#,Linq,Sorting,Odata,动态指定要排序的列和方向时遇到问题。 我目前拥有以下代码: if (sort != "OrderID") { if (sort == "EmployeeName") { sort = "Employee.FirstName"; //sort by Employee FirstName } else { sort = "Customer." + sort; //Customer.CompanyName sort } }

动态指定要排序的列和方向时遇到问题。 我目前拥有以下代码:

if (sort != "OrderID")
{
    if (sort == "EmployeeName")
    {
        sort = "Employee.FirstName"; //sort by Employee FirstName
    }
    else
    {
        sort = "Customer." + sort; //Customer.CompanyName sort
    }
}

var sortCriteria = string.Format("{0} {1}", sort, sortDir);
var res1 = nwd.Orders //response
    .OrderBy(o => sort+" "+sortDir)
    .ThenBy(o => o.OrderID)
    .Skip((page - 1) * rowsPerPage)
    .Take(rowsPerPage)
    .Select(o => new
    {
        o.OrderID,
        o.Customer.CompanyName,
        o.Customer.ContactName,
        o.Employee.FirstName,
        o.Employee.LastName,
        o.Order_Details
    }).ToList();

任何帮助都将不胜感激

好的,下面是一个使用虚拟类的工作示例:

internal class Program
{
    private static void Main(string[] args)
    {
        var list_people = new List<Person> {
              new Person() {Age = 4, Name = "yo"}, 
              new Person() {Age = 5, Name = "a"}  
        };

        var dynamic_propretry = typeof (Person).GetProperty("Name");
        var sorted = list_people.OrderBy(person => dynamic_propretry.GetValue(person, null));

        foreach (var person in sorted)
        {
            Console.Out.WriteLine(person);
        }

        Console.ReadLine();
    }
}

public class Person{

 public int Age { get; set; }
 public string Name { get; set; }
    public override string ToString()
    {
        return Name + ":" + Age;
    }
} 
内部类程序
{
私有静态void Main(字符串[]args)
{
var list_people=新列表{
新人(){Age=4,Name=“yo”},
新人(){Age=5,Name=“a”}
};
var dynamic_propretry=typeof(Person).GetProperty(“名称”);
var sorted=list_people.OrderBy(person=>dynamic_propretry.GetValue(person,null));
foreach(分类中的var人员)
{
控制台输出写入线(人);
}
Console.ReadLine();
}
}
公共阶层人士{
公共整数{get;set;}
公共字符串名称{get;set;}
公共重写字符串ToString()
{
返回姓名+“:”+年龄;
}
} 
因此,您所要做的就是将所需的属性存储在一个字符串中,并在我使用
“Name”
的地方使用该字符串。它应该能用。

这个怎么样

var res1 = nwd.Orders //response

IOrderedQueryable<Orders> result;

if (sort != "OrderID")
{
    if (sort == "EmployeeName")
    {
        result = res1.OrderBy(o => o.Employee.FirstName);
    }
    else
    {
        result= res1.OrderBy(o => o.Customer.CompanyName);
    }
}

result = result.ThenBy(o => o.OrderID)
             .Skip((page - 1) * rowsPerPage)
             .Take(rowsPerPage)
             .Select(o => new
             {
                 o.OrderID,
                 o.Customer.CompanyName,
                 o.Customer.ContactName,
                 o.Employee.FirstName,
                 o.Employee.LastName,
                 o.Order_Details
             }).ToList();
var res1=nwd.Orders//response
可查询的结果;
如果(排序!=“订单ID”)
{
如果(排序=“员工姓名”)
{
result=res1.OrderBy(o=>o.Employee.FirstName);
}
其他的
{
结果=res1.OrderBy(o=>o.Customer.CompanyName);
}
}
result=result.ThenBy(o=>o.OrderID)
.Skip((第1页)*行页面)
.Take(rowsPerPage)
.选择(o=>new
{
o、 医嘱ID,
o、 Customer.CompanyName,
o、 Customer.ContactName,
o、 Employee.FirstName,
o、 Employee.LastName,
o、 订单详情
}).ToList();

您在string.format上有一个输入错误…另外,您确定
.OrderBy(o=>sort+“”+sortDir)
有效吗?我得到“无法隐式地将type'System.Linq.IOrderedQueryable'转换为'System.Data.Services.Client.DataServiceQuery'”当我尝试此操作时,您的上下文是什么以及nwd与上下文的关系如何?var nwd=new OdataServiceReference.NorthwindEntities(new Uri(“);我在调查LINQPad查询的工作方式后做了一些更改。看看这是否有帮助?好的,这表示“无法隐式地将类型“System.Linq.IQueryable”转换为“System.Linq.IOrderedQueryable”。我尝试使用so.OrderBy(o=>sortCriteria)这样的排序条件变量,但这也不起作用。你是说它应该类似于.OrderBy(o=>o.OrderID),对吗?我如何动态地做到这一点?是的,我就是这么说的。如果它是一个属性,你可以使用反射来获得它,除此之外,一个开关可能会为你服务,这取决于你有多少选择,以及你在这个方法上有多宽容:)好的,有没有一个was只为OrderBy做一个开关?(如果这是一个愚蠢的问题,很抱歉)嗯,在将这些顺序转换为列表之后,它现在会在一行上显示一个NullReferenceException,该行的内容为“.Select(o=>new)”,请查看更新的答案。这是一个更好的工作示例。您只需使用您的对象/排序,即可完成设置。