【问题标题】:How to use an Argument in NewExpression as Expression to be used in OrderBy method?如何将 NewExpression 中的参数用作要在 OrderBy 方法中使用的表达式?
【发布时间】: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


【解决方案1】:

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

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

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

...然后:

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

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

【讨论】:

  • 我知道它可以写出这样的东西。但这不是我想要的这个问题。我需要一些方法来将二进制表达式(如 x.col1 + ' ' + x.col2)转换为可以在 OrderBy 方法中使用的表达式。但是,如果每个人都无法解决这个问题,我会使用类似你的建议来解决这个答案。
  • 你可以写Expression&lt;Func&lt;Person, string&gt;&gt; nameExp = p =&gt; p.FirstName + " " + p.LastName然后你可以写.OrderBy(nameExp),这将转换为SQL。但请注意我在这里使用Person;这不适用于匿名类型。
猜你喜欢
  • 1970-01-01
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-26
相关资源
最近更新 更多