問題タブ [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.
iqueryable - System.Linq.Expressions.ExpressionVisitor は、保護レベルが原因でアクセスできません
IQueryable LINQ Provider の作成の指示に従おうとしていますが、指示どおりに継承するクラスを実装するExpressionVisitor
と、保護レベルのために ExpressionVisitor にアクセスできないと言われます。信じられないほど基本的な何かが欠けていますか?
linq - ExpressionVisitor.Visitとは行う?
誰かが答えを叫ぶ前に、質問を読んでください。
.NET4.0のExpressionVisitorのメソッドの目的は何ですか。
このメソッドの目的についての私の最初の推測は、パラメーターで指定された各ツリーの各ノードにアクセスしnodes
、関数の結果を使用してツリーを書き換えることでしたelementVisitor
。
これは当てはまらないようです。実際、この方法は、私がここで何かを見逃していない限り、何もしないように見えます。
コードでこのメソッドを使用しようとしましたが、期待どおりに機能しなかった場合は、メソッドを反映して次のことがわかりました。
では、誰かが実際にこの方法をどこで使用するのでしょうか。ここで何が欠けていますか?
ありがとう。
c# - 条件式の文字列への解析
条件式を文字列に解析する方法を探しています。
私が考えることができる最良の例は、LINQ-to-SQLです。ExpressionVisitorsを使用して「Where」句をフォーマットします。例:
これは、次の文字列に変換されます(おおよそ、MSSQLは私にとって最新ではありません)。
私が読んだことから、これはこの記事で説明されているように、ExpressionVisitorクラスを使用して行われました:リンク
問題は、LINQを使用していないことですが、この特定の機能が必要です。そのような条件を解析する方法はありますか?リフレクション、デリゲート、ラムダなどで何でもするつもりです。
正直なところ、それは不可能だと思いますが、私の脳は少し揚げられているので(読んでください:質問がばかげているならいいです)、私はS/Oを試してみたほうがいいと思いました。
編集:最終的な使用例:
編集2:はい、数は3より小さく、5に等しくすることができます。私の脳は揚げられているとあなたに言いました。
c# - linq式から句を削除できますか?
linq式/クエリ演算子からwhere句を追加/削除できるかどうか疑問に思いました。
例:-
後の段階でwhere式を削除することは可能ですか?
前もって感謝します :)
c# - コンパイルせずに既存の LambdaExpression から LambdaExpression を構築する方法
2 つの LambdaExpressions をコンパイルせずに結合したい。
これをコンパイルすると、次のようになります。
これは明らかに、提供された引数からターゲット式を取得する最速の方法ではありません。また、C# メソッド呼び出しをサポートしない LINQ to SQL などのクエリ プロバイダーとの互換性がなくなります。
私が読んだことから、最良のアプローチはExpressionVisitor
クラスを構築することのようです。ただし、これはかなり一般的なタスクのようです。この種の機能を提供する既存のオープン ソース コード ベースを知っている人はいますか? ExpressionVisitor
そうでない場合、可能な限り一般的なものにするためにアプローチする最良の方法は何ですか?
c# - IEnumerable へのアクセス子供
ここで私たちがやりたいこと。
レポートを作成するためにフォーマットする必要があるデータベースからのデータがあります。これには、いくつかの計算 (合計、平均、およびフィールド間の計算 (例: xa / xb)) が含まれます。
制限の 1 つは、たとえば合計で、データの 1 つが null、-1、または -2 の場合、計算を停止して「-」を表示する必要があることです。生成するレポートが多数あり、それぞれに同じロジックと多くの計算があるため、このロジックを一元化したいと考えています。今のところ、生成するコードでは、フィールド間の計算 (xa / xb など) を確認できますが、グループの合計 (xb / SUM(xa) など) を確認することはできません。
テストケース
ルール
- 計算で使用される値のいずれかが -1、-2、または null の場合、計算を実行しないでください。この場合、-1 または null が見つかった場合は "-" を返し、-2 が見つかった場合は "C" を返します。
- 計算に複数の「悪い値」がある場合は、null -> -1 -> -2 のように定義された優先度を尊重する必要があります。この優先順位は、値が計算内にあるレベルとは無関係です
テスト
簡単な計算
複雑な計算
これまでに行ったこと
ここで、このスレッドに基づいて単純な計算を処理する必要があるコード:
How to extract properties used in a Expression<Func<T, TResult>> query and test their value?
計算を実行し、結果を文字列として返す厳密な型のクラスを作成しました。ただし、式の一部が特殊な値と等しい場合、電卓は特殊文字を返す必要があります。
次のような単純なケースではうまく機能します。
しかし、次のようなもっと複雑なことを実行できる必要があります。
カプセル化またはデータの取り込みを開始するIEnurmarable<>
と、エラーが発生します。
オブジェクトがターゲット タイプと一致しません
私たちが理解しているように、それは Sub-Expressionがではなく にy => y.UnitesDisponibles
適用されているためです。IEnumerable
Rapport1Data
いつか次のような複雑な式がある場合、完全に再帰的になるように修正するにはどうすればよいですか。
私たちが構築したクラス
およびカスタム ExpressionVisitor
[更新] やりたいことの詳細を追加
entity-framework - その場でEntity Frameworkの置換された式ノードにパラメータをバインドする方法
Utility.GetString(MyEntity.SomePropertyWithRelatedEntity)=="abc"
(単純化された) のような関数呼び出しを式のビジターに置き換えようとしていますp => p.SubRelatedEntities.FirstOrDefault(sre => sre.SomeFlag==true).SomePropertyWithRelatedEntity
。
つまり、データモデルは次のようになります: MyEntity -> RelatedEntity -> SubRelatedEntity
SubRelatedEntity
のいくつかのルールに基づいて、から文字列値を返そうとしているRelatedEntity
ので、使用するたびにフィルタリング ルール全体を書き直したり、コピーしたり、貼り付けたりする必要はありません。そのため、「呼び出し署名」を入れて、式のビジターがそれを識別し、偽の呼び出しをUtility.GetString
いくつかの複雑なラムダ式に置き換えることができるようにします。
私の式ビジターには次のようなものが含まれています:
ここでの問題は、注入されたラムダ式が呼び出されたときに「sre」パラメーターがバインドされていないことです。多くの調査の結果、ラムダ パラメータを別の式ビジターに置き換える必要があることがわかりました。具体的には、新しいパラメータを検索して古いパラメータに置き換えます。ただし、私の状況では、「古いパラメーター」はありませんMyEntity.SomePropertyWithRelatedEntity
。生成されたラムダに何らかの方法で挿入する必要がある式 (関連するエンティティで満たされたプロパティなど) があります。
私の問題が理解できることを願っています。洞察をありがとう!
c# - ExpressionVisitor をどのように単体テストしますか?
私はエンタープライズ環境で働いており、フロント エンド (クライアントと Web) は DB に直接アクセスするのではなく、ネットワーク経由でサービスと通信します。外部から利用可能な ASP.Net Web API の概念実証作業が開始されており、OData を使用できるように IQueryable の実装を使用しようと考えていました。問題は、Web API がネットワーク ホップ離れたサービス層にアクセスする別の "フロントエンド" になることです。つまり、IQueryable の独自の実装を作成する必要があります。
1 つの IQueryable 実装は、私が RangeQueryable と呼んでいるもので、抽象的で 3 つの汎用パラメーターを取ります。TRaw、TData、TRange。それはIQueryable<TData>
前のコード行で、RawData は TRaw、ConvertedData は TData、DateTime は TRange です。
RangeQueryable にも 2 つの抽象メソッドがあります。
GetData は、ネットワークを介してサービス レイヤーを呼び出し、呼び出しのパラメーターとしてfrom
andを使用します。to
Convert は、データを自分の型に変換します。
TRaw はサービスが返す型、TData はフロントエンド内の型と IQueryable 内の型、TRangei は範囲型です。
したがって、これは可能です:
...または同等の OData。
ここで ExpressionVisitor の出番です。ExpressionVisitor を使用して From と To の日付を見つける必要があります。
いくつかのチュートリアルを見て、いくつかのアイデアを思いつきました。私が抱えている問題は、ExpressionVisitor を単体テストする方法がわからないことです。Queryable 拡張メソッドが作成するものと同等の Expression を作成するにはどうすればよいですか?
linq - ExpressionVisitor ソフト削除
エンティティ フレームワークで論理的な削除機能を実装する際に問題が発生しています。アイデアは、EF コンテキストを認識しているリポジトリを使用することです。プラグイン システムを実装したレポジトリのレベルでは、レポジトリでアクションが実行されるたびに、これらのプラグインが実行されます。たとえばRepository.GetQuery<Relation>()
、プラグインを呼び出すと実行されます。プラグインの 1 つは です。このプラグインは、select にある各テーブルにステートメントをLogicalDeletePlugin
追加する必要があります。Where(x => x.IsDeleted)
アイデアは、linq 式にアクセスし、すべての「テーブル」選択ステートメントを見つけて条件を追加するIsDeleted
を使用してこのプラグインを実装することでした。ExpressionVisitor
IsDeleted
質問/問題を明確にするために、いくつかのコード例を使用して問題を説明します。
上記の c# コードは、次の SQL コードになります。
結果の SQL クエリでわかるように、IsDeleted
ステートメントはTestWorks = x.Bonus.Where(y => !y.IsDeleted)
「select」コードに追加されます。TestVisitor
が現在行っていることです。しかし、問題は、これを他の選択にもどのように実装できるかということです。これは一部x => !x.IsDeleted
に追加されません。Test = x.Bonus
ExpressionVisitor はこれを行うための正しいアプローチですか、それとも別のソリューションを使用する必要がありますか? すべての助けに感謝します!説明が十分に明確でない場合はお知らせください。追加情報を提供します。
編集:
上記は、私が ExpressionVisitor に追加したものです。return Expression.MamkeMemberaccess コードのコメントを外すと、MemberExpression などを想定していないため、例外がスローされます。
以下は私が思いついた解決策です:
QueryConditional は、 type の Expression を保持するクラスExpression<Func<T, bool>>
です。
InjectconditionVisitor は、 のように InterceptWith (QueryInterceptor NuGet パッケージ) と組み合わせて使用できますquery.InterceptWith(new InjectConditionVisitor(new QueryConditional(x => x.Deleted == true))
。