3

我编写了一个 LINQ-Provider,它运行良好,但有一个例外。它将 LINQ 查询转换为 ODATA URL 标准。

如果我有以下 LINQ 语句:

.Select(x => x.Name.ToLower()).OrderByDescending(x => x)

当我用表达式访问者访问表达式树时,我会得到一个表达式部分(OrderByDescending),它的类型是ParameterExpression。

用于 ParameterExpression 的 IntelliSense

我现在的问题是:如何获得选定的 x.Name.ToLower() 表达式?这样我就可以将 orderBy 语句翻译为

$orderby=tolower(Name) desc

// 编辑:换句话说:我有一个 ParameterExpression {x => x}。我希望将此表达式解析为 {x => x.Name.ToLower()}

4

1 回答 1

1

您的代码有两个问题:

1) 上面的 LINQ 表达式并不表示 /Entities?$orderby=tolower(Name) desc。实际上没有办法将其转换为 OData。LINQ 查询将获取所有实体,获取它们的 Name 属性并返回小写的字符串(名称)列表。它还将对列表进行排序(降序)。

2) 此类表达式的表达式树如下所示:

Call OrderBy
- Argument 1 = Call Select
    - Argument 1 = Entities
    - Argument 2 = Lambda with parameter x(1)
       Body = ToLower(x(1).Name)
- Argument 2 = Lambda with parameter x(2)
   Body = x(2)

x(1) 和 x(2) 是 ParameterExpression 节点,它们表示 Select 和 OrderBy 调用中 lambda 的参数。将 x(2) 替换为 Select (ToLower(x(1).Name)) 的 lambda 主体将不起作用。首先,该主体中有 x(1) 参数,这在第二个 lambda 的上下文中没有任何意义。其次,它会改变表达的意思。

要获得 $orderby=tolower(Name) desc,输入上的 LINQ 表达式必须类似于:

Entities.OrderByDescending(x => x.Name.ToLower())
于 2013-01-01T16:54:57.177 回答