Asp.net mvc 如何将NewExpression中的参数用作OrderBy方法中要使用的表达式?

Asp.net mvc 如何将NewExpression中的参数用作OrderBy方法中要使用的表达式?,asp.net-mvc,linq-to-entities,lambda,c#-4.0,poco,Asp.net Mvc,Linq To Entities,Lambda,C# 4.0,Poco,首先,我使用C4.0和EF4.0以及POCO对象来访问数据库。接下来,我创建了一些类似jqGrid的网格,用于通过ASP.NETMVC2.0显示数据库中的数据。此网格可以通过单击列标题对数据进行排序。源代码可能是这样的 // This method will generate data for jqGrid request. // jqGridRequest contain several options about how to query data like // Take 10 re

首先,我使用C4.0和EF4.0以及POCO对象来访问数据库。接下来,我创建了一些类似jqGrid的网格,用于通过ASP.NETMVC2.0显示数据库中的数据。此网格可以通过单击列标题对数据进行排序。源代码可能是这样的

// This method will generate data for jqGrid request.
// jqGridRequest contain several options about how to query data like 
//   Take 10 result
//   Skip 50 rows
//   Filter by something
//   Order by column name
public JsonResult GetPeopleData(jqGridRequest req)
{
   // This extension method has 2 parameters that are jqGridRequest and 
   // Expression<Func<T, object>> for creating object to be serialized.
   // In this case, T is People type.       
   return DataContext.People.AsJqGridResult
   (
       req,
       x => new 
       {
           x.ID,
           Name = x.FirstName + " " + x.LastName,
           x.Age
       }
   )
}
但是,我需要创建一些方法来处理像这样的简单orderby条件。在我搜索并尝试任何关于表达的可能性之后。我刚刚发现我可以使用NewExpression中包含的一些数据来对这个查询进行排序。但我不知道如何将NewExpression对象中的参数转换/创建为表达式,以用作OrderBy方法参数

谢谢

数据库中不存在名称,但它确实存在于您投影到的匿名类型中

我不会去猜测你所有的扩展方法都做了什么。但如果你做到了:

var q = from p in DataContext.People
        select new 
        { 
            Name = p.FirstName + " " + p.LastName
        };
…然后:

var r = q.OrderBy(p => p.Name);

…那么它应该可以工作。

创建SQL视图不是一个选项吗?创建视图将违背使用ORM IMO的目的。我认为创建SQL视图对于这个问题没有意义。此外,我不能直接从任何基于POCO的类创建对象,因为当我序列化它时,它在POCO代理类中的循环引用总是有错误。但这并不是我想问的问题。我需要一些方法将二进制表达式(如x.col1+“”+x.col2)转换为可在OrderBy方法中使用的表达式。但是,如果每个人都不能解决这个问题,我将使用类似于您的建议的方法来解决这个问题。您可以编写表达式nameExp=p=>p.FirstName++p.LastName,然后您可以执行。OrderBynameExp,这将转换为SQL。但请注意,我在这里使用的是Person;这不适用于匿名类型。
var r = q.OrderBy(p => p.Name);