3

完全に機能するLINQ-Providerを作成しましたが、1つの例外があります。LINQ-QueriesをODATA-URL標準に変換します。

次のLINQステートメントがある場合:

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

また、式ビジターを使用して式ツリーにアクセスすると、タイプがParameterExpressionである式パーツ(OrderByDescending)を取得します。

ParameterExpressionのIntelliSense

私の質問は今です:選択したx.Name.ToLower()式に到達するにはどうすればよいですか?orderByステートメントを次のように変換できるようにします

$orderby=tolower(Name) desc

//編集:言い換えると:ParameterExpression {x=>x}があります。この式を{x=>x.Name.ToLower()}に解決したい

4

1 に答える 1

1

コードに関する2つの問題:

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呼び出しのラムダへのパラメーターを表します。x(2)をSelectのラムダの本体(ToLower(x(1).Name))に置き換えても機能しません。まず、その本体にはx(1)パラメーターが含まれていますが、これは2番目のラムダのコンテキストでは意味がありません。そして第二に、それは表現の意味を変えるでしょう。

$ orderby = tolower(Name)descを取得するには、入力のLINQ式は次のようになります。

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