【发布时间】:2011-01-20 16:37:16
【问题描述】:
首先,我使用带有 POCO 对象的 C# 4.0 和 EF 4.0 来访问数据库。接下来,我创建了一些网格(如 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 方法参数。
谢谢
【问题讨论】:
-
创建 SQL 视图不是一种选择吗?
-
创建视图会违背使用 ORM IMO 的目的。
-
我认为创建 SQL 视图对这个问题没有意义。此外,我不能直接从任何基于 POCO 的类创建对象,因为当我序列化它时,它总是在 POCO 代理类中出现循环引用错误。
标签: asp.net-mvc linq-to-entities lambda c#-4.0 poco