如何在NewExpression中使用Argument作为在OrderBy方法中使用的表达式?

时间:2010-02-24 19:26:14

标签: asp.net-mvc linq-to-entities lambda c#-4.0 poco

首先,我使用C#4.0和EF 4.0与POCO对象来访问数据库。接下来,我创建了一些网格(如jqGrid),用于通过ASP.NET MVC 2.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
       }
   )
}

一切正常。问题是当我尝试在此网格中订购“名称”列时,jqGrid将通过“名称”列发送告诉控制器订购数据的请求。但是,“名称”列在数据库中不存在,因为它只是某个列的组合值。

最容易解决这个问题的是创建一些代码来执行类似下面的代码。

DataContext.People.OrderBy(x => x.FirstName + " " + x.LastName);

但是,我需要创建一些方法来处理这样的简单orderby条件。在我搜索并尝试表达的任何可能性之后。我刚刚发现我可以使用NewExpression中包含的一些数据来订购此查询。但我不知道如何将NewExpression对象中的Argument转换/创建为Expression,以便使用OrderBy方法参数。

感谢

1 个答案:

答案 0 :(得分:0)

数据库上不存在

Name,但确实存在于您要投射到的匿名类型中。

我不打算尝试猜测所有扩展方法的作用。但如果你这样做了:

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

......然后:

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

......那么它应该“正常工作”。