将ParameterExpression解析为实际表达式

时间:2013-01-01 14:23:37

标签: c# linq expressionvisitor

我编写了一个完美的LINQ-Provider,但有一个例外。它将LINQ-Queries转换为ODATA-URL标准。

如果我有以下LINQ语句:

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

当我使用表达式访问者访问表达式树时,我将得到一个表达式部分(OrderByDescending),其类型为ParameterExpression。

IntelliSense for ParameterExpression

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

$orderby=tolower(Name) desc

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

1 个答案:

答案 0 :(得分: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的参数。 用Select(ToLower(x(1).Name)的lambda的Body替换x(2)将不起作用。首先,该主体中包含x(1)参数,这在第二个lambda的上下文中没有意义。其次,它会改变表达的含义。

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

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