問題タブ [expressionvisitor]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
140 参照

expressionvisitor - ExpressionVisitor.VisitParameter、各パラメーターを 2 回印刷するのはなぜですか?

VisitParameter が各パラメータを 2 回出力するのはなぜですか?

結果:

バツ


y


バツ


y


0 投票する
1 に答える
345 参照

c# - ParameterExpressionを実際の式に解決します

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

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

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

ParameterExpressionのIntelliSense

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

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

0 投票する
0 に答える
762 参照

c# - C# ExpressionVisitor.VisitBinary

From: 方法: 式ツリーを変更する (C# および Visual Basic)

http://msdn.microsoft.com/en-us/library/bb546136.aspx

このメソッドの目的とその動作について間違っている場合は修正してください。ありがとうございました。

既存の experssion がある場合、Expresstion Visitor はすべての BinaryExpression をこのメソッドに送信するため、私の理解では、この 2 行は無駄です。

これらの 2 つの行は同じことを行うため、このメソッドに送信されるすべての BinaryExpression に対して責任があります。私は正しいですか?

Expression.MakeBinary の目的は、BinaryExpression を新しいものに更新することです。では、なぜこの方法を使用しないのですか: b.Update??

最後に、このメソッドは、この式のすべての AndAlso を OrElse に置き換えますか?

よろしくお願いいたします。

0 投票する
1 に答える
275 参照

c# - ac#式を変換する

ac#式を変換しようとしています。これが私が探している結果の例です。変換:

これに:

以下のコードでわかるように、FieldIDは、実際にはクラスの属性の反映を介して取得されます。私が今得ているエラーは、「タイプ'System.Int32'の式はリターンタイプ'System.Boolean'には使用できません」であるConvertからのリターンです。

私は壁にぶつかって、誰かが私がここで間違っていることを見ることができるかもしれないと思いました。これが私のコードです:

0 投票する
0 に答える
503 参照

linq - 複数の型を持つ ExpressionVisitor

Expression<Func<T1,bool>>ExpressionVisitor を使用して型をに変換していますがExpression<Func<T2,bool>>、非常にうまく機能します。しかし、ナビゲーション プロパティ ExpressionVisitor が原因で、式に別の型が含まれていると例外が発生することに気付きました..

2 つの異なるクラスがあるとします。

これらの 2 つのクラスには、接尾辞「Info」が付いた完全に等しい DTO があります。だから私は4つのクラスを持っていますBrand, BrandInfo, Model, ModelInfo

今、私は以下のような表現を得ました。

Expression<Func<BrandInfo,bool>>この式は で正常に変換できますExpressionVisitor。しかし、以下のような式を変換したい場合、例外が発生します。

ExpressionVisitorのみで機能し、クラスとBrandクラスにはプロパティとしてが含まれますが、ターゲット クラス BrandInfo にはプロパティとしてが含まれます。したがって、プロパティをバインドしようとすると、例外がスローされます。BrandInfoBrandIEnumerable<Model>ModelsIEnumerable<ModelInfo>ModelsExpressionVisitorModels

複数の型を含む式を変換する方法が見つかりませんでした。

ここに私が変換するために使用するコードがあります

0 投票する
1 に答える
1164 参照

c# - ExpressionVisitor.Visit は、データ サービス クエリ ビジターで「還元可能なノードである必要があります」というエラーをスローします。

WCF データ サービスのリポジトリ パターンの実装に問題があります。要約すると、必要なリポジトリにプラグ可能なモデルを利用するクライアント アプリケーション内でリポジトリ パターンを使用しようとしています。根本的な問題は、私のリポジトリ インターフェイス IRepository が、それが格納するアイテムのインターフェイス タイプ バリアントについてしか認識できないことです。これは、注文の Data Service 実装からクライアント アプリケーションを抽象化することです。

一般に、この概念は、Data Services が関与するまで問題なく機能します。現在、NuGet の Data Services v5.4 を使用しています。リポジトリで ToList() のような単純なアクションを実行すると、すべてが正常に機能し、変換によって結果が OData サービスからの注文のリストに変換されます。ただし、orderby を実行しようとすると、クエリ式がより複雑になり、クエリ可能な型のインターフェイス バリアントのインスタンスを作成しようとするため、戻り値の型を設定できません。つまり、Order の代わりに IOrder のインスタンスを作成しようとします。

ただし、クライアントレベルでは、キャストを使用して型を強制すると機能します...

明らかに、これは切断された型のマントラに反しています。クライアント アプリケーションは、将来 OData を切り替えたい場合に備えて避けたいデータ サービス ライブラリからの強力な型 'Order' を認識しなければならないからです。

次に、タイプを解決するためのメソッドのハンドルを取得できる Data Service Client 側の Context クラスに出くわしましたが、私の場合、何らかの理由で解決が呼び出されませんでした。

その後、私が見始めたのは ExpressionVisitors でした。これは、この混乱から抜け出すためのチケットであると今でも信じています。これは、クエリが強い型を返しますが、インターフェイスの種類。

空のシェル ExpressionVisitor 実装を使用する場合など

これは、データ サービス以外のクエリ (クエリ可能なリストなど) では問題なく機能しますが、データ サービス リポジトリ パターンのクエリでは、(少なくとも私にとっては) 役に立たない「ノードを縮小する必要があります」というメッセージが表示されます。私が推測しているのは、式ツリーのビジターが、データ サービス クエリにカスタム化されたノード タイプにヒットし、それに対して何をすべきかわからないということです。しかし、何か別のことをするように言われない限り、ExpressionVisitor は単にツリーにあるものをコピーすると思いましたか?

とにかく、私が求めているのは、この ExpressionVisitor を使用してクエリの戻り値の型を OData クエリに置き換えるにはどうすればよいですか? 既存の Data Services Expression Visitor を探してみましたが、見つかりません。クライアント側のデータ サービスでインターフェイス タイプのクエリからクエリを生成する必要がありますが、同じ名前の厳密な型が返されます。

0 投票する
1 に答える
308 参照

c# - 式 x=>!x を x=>x!=true に、x=>x を x=>x==true に書き換える方法

次のように表現すると仮定します。

上記のような式を次のような式に変換 (式ビジターを使用して書き換え) する必要があります。

注: より複雑な式がある場合、リライターはより一般的なケースでも機能する必要があります。