我编写了一个完美的LINQ-Provider,但有一个例外。它将LINQ-Queries转换为ODATA-URL标准。
如果我有以下LINQ语句:
.Select(x => x.Name.ToLower()).OrderByDescending(x => x)
当我使用表达式访问者访问表达式树时,我将得到一个表达式部分(OrderByDescending),其类型为ParameterExpression。
我的问题现在是:如何进入选定的x.Name.ToLower()表达式?这样我就可以将orderBy语句翻译成
$orderby=tolower(Name) desc
//编辑:换句话说: 我有一个ParameterExpression {x => X}。我希望将此表达式解析为{x => x.Name.ToLower()}
答案 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())