简体   繁体   English

动态linq OrderBy对我不起作用

[英]Dynamic linq OrderBy isn't working for me

I am having trouble dynamically specifying the column and direction to sort on. 我在动态指定要排序的列和方向时遇到了麻烦。 I currently have the following code: 我目前有以下代码:

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();

Any help would be much appreciated! 任何帮助将非常感激!

How about this? 这个怎么样?

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();

Ok, here's a working example with a dummy class: 好的,这是一个带有虚拟类的工作示例:

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;
    }
} 

So, all you have to do is store the property you want in a string, and just use that string where I used "Name" . 因此,您要做的就是将所需的属性存储在字符串中,并在我使用"Name"地方使用该字符串。 It should work. 它应该工作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM