問題タブ [expression-trees]
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.
c# - 2 つのメンバー式ツリーを結合するにはどうすればよいですか?
次の式を 1 つの式に結合しようとしています: item => item.sub, sub => sub.key を item => item.sub.key にします。これを行う必要があるのは、アイテム セレクターをキー セレクターに個別に渡す OrderBy メソッドを作成できるようにするためです。これは、OrderBy のオーバーロードの 1 つを使用して を提供することで実現できますが、IComparer<T>
SQL には変換されません。
以下は、私が達成しようとしていることをさらに明確にするためのメソッド シグネチャと、機能しないがポイントを説明する必要がある実装です。
これは次のように呼び出されます。
これは可能ですか?より良い方法はありますか?このように動作する OrderBy メソッドが必要な理由は、さまざまな方法で公開されますが、多くのエンティティに適用される複雑なキー選択式をサポートするためです。また、深いプロパティの文字列表現を使用してこれを行う方法を認識していますが、強く型付けしたままにしようとしています。
c# - C#、Linq2Sql:2 つのクエリ可能なものを 1 つに連結することは可能ですか?
コレクションを特定のセットに絞り込むためにさまざまなWhere
andステートメントを使用したクエリ可能なものが 1 つあります。WhereBetween
ここで、一種の a を追加する必要がありWhere || WhereBetween
ます。言い換えれば、今までのようにそれらを連鎖させることはできません。それは And として機能するからです。それで、どうすればこれを行うことができますか?
2 つの可能性があります。
- 私が持っているものから2 つのクエリ可能オブジェクトを作成
Where
します。1 つは を使用し、もう 1 つは を使用しWhereBetween
ます。そして、それらを連結します。これが可能かどうかわかりませんか?また、私の特定のケースではありませんが、おそらく重複してしまうでしょう... - どういうわけか式と で作成された式をある種の Or でマージします。
Where
WhereBetween
最初に述べたように、可能かどうかさえわかりません。もしそうなら、それが良い方法であるかどうかはわかりません。
2 つ目は、オプションとして表示できますが、すべての詳細について完全にはわかりません。以下は、WhereBetween
私の他の質問からの方法です。これは現在使用しており、うまく機能します。
その表現構築部分を新たな手法として抽出できればと考えています。おそらく次のようになります。
次に、その新しいメソッドを使用して、クエリ可能ではなく式を取得できます。WhereBetween(ø => ø.Id, someRange)
たとえば、 andがあるとしましょうø => ø.SomeValue == null
。これらの 2 つを Or と組み合わせるにはどうすればよいですか? 私はメソッドでExpression.OrElse
使用されているを見ていWhereBetween
ます.それが私が必要としているものかもしれませんExpression.Or
. しかし、私はこの式に関して非常に不安定なので、ここで何を選択すればよいか、または正しい軌道に乗っているかどうかさえわかりません:p
誰かがここで私にいくつかの指針を教えてもらえますか?
c# - linq to sqlの式ツリーに1回だけ評価されるInvocationExpressionを含めるにはどうすればよいですか?
式ツリーを手動で組み合わせて、標準のlinq演算子を使用しているように見えるレベルのモジュール性を実現しようとしています。このコードは基本的に、1つの式を使用して、他の2つの式のどちらを呼び出すかを決定する式ツリーを作成します。他の式の1つには、別の式を使用してそれ自体が取得される追加のパラメーターが必要です。このパラメーターは複数の値を取得するために使用されますが、アクセスごとにパラメーターを取得する式が繰り返されます。説明をわかりやすくするために、コードと出力を含めました。
データベースでこのクエリを実行すると、SQLは次のように生成されます。
問題は、サブ選択が重複していることです。1つは「開始」値を取得し、もう1つは「終了」値を取得します。それらが両方とも単一のサブ選択から取得された方がはるかに良いでしょう。これを強制するために式ツリーの構造を変更するにはどうすればよいですか?また、このクエリを実行する簡単な方法があることも理解していますが、これはここに示されていないより大きなフレームワークの一部であり、再利用可能な式の大規模なセットから式ツリーを手動で組み立てることによってのみ実現できます。
c# - 遺伝的プログラミングのための C# 動的ツリー
私は、メンバー間の関係を持ついくつかのパブリックユーザー定義クラスと、特定および汎用のシグネチャを持ついくつかのメソッドを持っています。
if/then/else、foreach、do/while、変数割り当てなどの基本的な制御ステートメントを使用して、これらのクラス (および CLR クラス) でカスタム制御フローを格納および操作できるようにしたいと考えています。
カスタム制御フローは実行時に作成し、後で使用および操作するために保存する必要があります。アイデアは、遺伝的操作を適用できるようにするために、厳密に型指定された構文を使用して、おそらく抽象的な構文ツリーの形式で、制御フローのデータ表現を持つことです。結果のカスタム コードは、別のプログラムの一部として実行する必要があります。
1)遺伝的操作を操作し、クラスを含むコードを実行するための推奨されるコード表現は何ですか。
2) 上記の問題には、どの c# テクノロジを使用する必要がありますか? リフレクション、新しい c# 3.0 機能 (ラムダ、式ツリー)、CodeDom、DLR ライブラリなどの関連テクノロジがあることは知っていますが、どのアプローチまたは組み合わせが最も効率的かを知っています。
3) 利用可能なそのようなパラダイムまたは実装はありますか?
編集: プラットフォームには、定数と時間変数の両方の定義済みの c# カスタム型のデータが提供されます。
刻々とルールがデータに適用され (基本的な条件またはより複雑な機能)、いくつかのアクションを実行することが決定されます。
私はできるようになりたいです:
ルールを木やグラフで表現し、その流れを実行します。
ユーザーが UI ツールキットを介してカスタム ルール セットを作成する
ツリーまたはグラフ上で再配置を行い、GP 操作を適用する
.net - Linq から SQL データへのアクセスをカプセル化する最良の方法は何ですか?
オブジェクト マッピングをプロジェクト データ リポジトリにカプセル化しようとしています。おそらく、EF は必要なレベルの抽象化を提供しますが、さまざまな理由から、現時点では Linq to SQL を使用しています。次のコードは、データベース内のユーザーを ModUser オブジェクトのリストとして返すことを目的としています。ここで、ModUser は、リポジトリが公開する POCO です。
別の式の中から MapResource 式を呼び出そうとしているため、MapResource 式を呼び出すことができないため、コードは失敗します。「MapResource」を u => new ModResource() に置き換え、ExpressionVisitor を使用してこのプレースホルダー ノードを見つけ、MapResource 式に置き換えることで、これを回避することができました。
ModUser のプロパティを単一のプロパティを含む式、つまり UserResource = MapResource に割り当てようとすると、同様の問題が発生します。Expression クラスのメソッドを使用して必要な式を手動で組み合わせることで、この 2 番目の問題を回避することができました。
上記のコードを次のように変更できることを認識しています
しかし、生成された最終的な SQL クエリは、関数を扱っているため、MapResouce が必要とするものだけでなく、r のすべての属性を取得する必要があります。また、MapResouce が r 上のさらなるテーブルへのアクセスを必要とする場合、それは式ではなく関数として使用されているため不可能です。DeferredLoadingEnabled を true に設定することもできますが、それでは、必要なテーブルと結合するようにメイン クエリを変更するのではなく、多数の個別のクエリが生成されます。
これらの操作が .NET の将来のバージョンでより簡単になるかどうか、または間違った方法で行っているかどうかは誰にもわかりませんか? 私は Linq と Expression の機能がとても気に入っています。より読みやすいコードを使用してそれらを使用できればと思っています。
更新しました
式をより構成可能にした方法の例をいくつか追加するかもしれないと思いました. それらは簡潔ではありませんが、仕事を成し遂げます。
私はここで何をしているのですか?このバージョンの MapUser では、ModResource オブジェクトを正しく作成していないことに注意してください。ダミー バージョンを作成するだけです。次に、ダミー呼び出しを検索する式ビジター メソッドを呼び出して、最初に必要だったものに置き換えます。もともと欲しかった式ツリーを本質的に構築できるため、式の構文が不足しているように思えますが、実際にツリーを表示してそれを行う必要があります。以下は、特異なケースを扱う、私が見つけた別の回避策です。
この 2 番目の例では、ユーザー データからリソース データを取得できることはわかっていますが、これを行う方法を示してリソース データをリソース POCO にマップする式を「インライン化」することはできません。しかし、既にマップされたリソース POCO を指定して式ツリーを手動で作成し、それを使用することはできます。次に、ユーザーからリソースの生データを取得する方法を示す別の式と、生のリソース データをリソース POCO にマップする方法を示す最後の式を作成します。プライマリ ユーザー パラメータからリソース固有のパラメータを取得できるため、リソース固有のパラメータを「折りたたむ」方法で、このすべての情報を 1 つの式ツリーに結合できると考えられます。これが上記のコードの動作です。
だから私は式を高度に構成可能にする方法を見つけました...それはただきれいに感じられません.
c# - 匿名タイプを選択するためのLINQ式ツリーの作成方法
式ツリーを使用して、次のselectステートメントを動的に生成したいと思います。
生成する方法を考え出しました
しかし、selectラムダで複数のプロパティを指定できるコンストラクター/オーバーロードが見つからないようです。
c# - ダミーの式ツリー?
私はこのシナリオのダミーです。
これらが何であるかをGoogleで読み取ろうとしましたが、わかりません。誰かがそれらが何であるか、なぜそれらが役立つのかを簡単に説明できますか?
編集: .Net の LINQ 機能について話しています。
c# - C# 式を変換する方法> 式へ>
ラムダに基づいて以前に C# 式を使用したことがありますが、手動で作成した経験はありません。が与えられたExpression<Func<SomeType, bool>> originalPredicate
ので、 を作成したいと思いますExpression<Func<OtherType, bool>> translatedPredicate
。
この場合、 SomeType と OtherType には同じフィールドがありますが、関連していません (継承がなく、共通のインターフェイスに基づいていません)。
背景: LINQ to SQL に基づくリポジトリ実装があります。モデルを POCO に保持するために、LINQ to SQL エンティティを Model エンティティに射影します。式を (仕様の形式として) リポジトリに渡したいのですが、式はモデル エンティティに基づいている必要があります。しかし、これらの式をデータ コンテキストに渡すことはできません。これは、LINQ to SQL エンティティに基づく式が想定されているためです。
c# - ラムダ式からプロパティ名を取得する
ラムダ式を介して渡されたときにプロパティ名を取得するためのより良い方法はありますか?これが私が現在持っているものです。
例えば。
プロパティが文字列の場合にのみ、メンバー式としてキャストすることで機能しました。すべてのプロパティが文字列であるとは限らないため、オブジェクトを使用する必要がありましたが、それらに対してunaryexpressionが返されます。