問題タブ [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.
asp.net-web-api - OData: ExpressionVisitor を使用して大文字と小文字を区別しない比較を行う
たとえば、次のような OData クエリがあります。
- /Suppliers?$filter=住所/都市 eq '都市'
- /Suppliers?$filter=contains(住所/都市, '都市')
- /Suppliers?$filter=endswith(住所/都市, '都市')
...
Address/City には「City」しかありません。私はまだクエリがそのレコードを返すことを望んでいます。
私はこれをすでに読みましたが、アドレスが含まれている機能にしか見えません。他の関数は簡単に修正できますが、eq はより困難です。簡単にするために、この .ToString().ToUpper() を実行して、すべての文字列 const を大文字に置き換えることを考えていました。
値に実際にアクセスできないため、問題が発生しています。
値を直接大文字に変更するか、ToString と ToUpper への呼び出しを追加するにはどうすればよいですか?
linq - ExpressionVisitor を使用して、「obj == value」を「obj.Equals(value)」に変更します
オブジェクトをIDである可能性のあるランダムな値とObjectKey、または同じオブジェクトと比較しようとしています。要するに、オブジェクトを同じ型だけでなく、何でも比較したいのです。
これを行うために、オブジェクトの Equals() と GetHashCode() をオーバーライドしましたが、期待どおりに動作しています。しかし、「obj == value」で検索すると、Linq がこれらのメソッドを呼び出さないことに気付きました。
クエリを「obj.Equals(value)」に変更すると、Equals() メソッドが呼び出されます。しかし、それは私が必要とするものではありません。
さらに、「==」および「!=」演算子をオーバーロードしようとしましたが、インターフェイスを介して検索しているため、これらのオーバーロードは呼び出されていません。
最後に、すべてのクエリを手動で変更することはできません。誰かが将来どこでも「==」を使用してコードを壊す可能性があるからです。
だから私は ExpressionVisitor に来ます。Linq クエリの式を書き直すことができることに気付きましたが、ちょっと無知です。見つけたいくつかの例を試しましたが、何らかのエラーが発生しました。
最後に、これが ExpressionVisitor 経由で必要なものです。
これを置き換えます: var objects = ctx.Where(obj => obj == value);
これに: var objects = ctx.Where(obj => obj.Equals(value));
出来ますか?
c# - ExpressionVisitor でトラバーサルを停止する
を使用してExpressionVisitor
式ツリーを解析し、指定されたパラメーターが含まれているかどうかを調べています。パラメータを見つけたら、トラバーサルを続けても意味がありません。
一般的に訪問者パターンで、より具体的には .NETでトラバーサルを停止する方法はありますか?ExpressionVisitor
これは私がこれまでに持っているものであり、期待どおりに機能しています。しかし、boolean フラグが true に設定されると、このアルゴリズムに関する限り、トラバーサルを停止することは理にかなっています。
c# - ラムダ式のパラメーターの型を置き換える
ラムダ式のパラメーターの型をある型から別の型に置き換えようとしています。
私はstackoverflowで他の答え、つまりこれを見つけましたが、私はそれらに運がありませんでした。
ドメイン オブジェクトと、ドメイン オブジェクトを取得できるリポジトリがあると想像してみてください。
ただし、リポジトリは独自のデータ転送オブジェクトを処理し、ドメイン オブジェクトをマップして返す必要があります。
ColourDto.cs
DomainColour.cs
リポジトリ.cs
ご覧のとおり、述語はドメイン モデル用であり、リポジトリ内のコレクションはデータ転送オブジェクトのコレクションであるため、これは機能しません。
これを行うために を使用しようとしましたが、たとえば、例外がスローされずにExpressionVisitor
のタイプを変更する方法がわかりません。ParameterExpression
テストシナリオ
最後に、例外は次のとおりです。
System.ArgumentException : プロパティ 'System.String Name' は型 'ColourDto' に対して定義されていません
誰かが助けてくれることを願っています。
編集:ここにdotnetfiddleがあります
まだ動作しません。
編集:ここに作業中のdotnetfiddleがあります
ありがとうエリ・アーベル
c# - 式ビジターまたは IDbCommandTreeInterceptor を無視する
論理的な削除が必要なデータベースには、IsActive
ビット列があります。false の場合、レコードが削除済みとしてマークされていることを示します。
IsActive
99% の場合、クエリにはtrueに設定されたレコードのみを含める必要があります。Entity Framework 6 では、DefaultExpressionVisitor
( を介してIDbCommandTreeInterceptor
) カスタムを使用して、テーブルに列が存在するときにこのチェックを自動的に行います。
ただし、ごくまれに、この動作をオーバーライドする必要があります。IQueryable の拡張メソッド、または式ビジターまたはコマンド ツリー インターセプターがチェックできる DbContext の設定を記述する方法はありますか?
私は次のようなことをしたいと思っています
また
これを行うときに発生する上記の動作に影響を与えます。
可能であれば、拡張メソッドルートを希望します。
c# - 式ツリーのパラメータ値を複雑な式に置き換えます
次の方法で ParameterExpression を別のものに置き換えています。
私はこのように使用しています:
ご覧のとおり、現時点でパラメーターを置き換えるには、新しい一時的な ParameterExpression を宣言して割り当てる必要があります。
その作業を回避し、ParameterExpression を値 ( ) を提供する Expression に直接置き換える方法があるかどうか疑問に思っていましたvalueGetter
。
明確にするために、このようなもの: