首先,我使用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方法参数。
感谢
答案 0 :(得分:0)
Name
,但确实存在于您要投射到的匿名类型中。
我不打算尝试猜测所有扩展方法的作用。但如果你这样做了:
var q = from p in DataContext.People
select new
{
Name = p.FirstName + " " + p.LastName
};
......然后:
var r = q.OrderBy(p => p.Name);
......那么它应该“正常工作”。