問題タブ [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.
linq-to-sql - Linq2SQL式でのコード共有のオプション
同じ複雑なWhere句を含むLinqからSQLへのクエリのペアがあります。具体的には次のとおりです。
そして、このコードのチャンクをあちこちにコピーして貼り付けるのではなく、共有できる他の何かにリファクタリングしたかったのです。SQLに変換できないため、通常のメソッドではこれを実行できないことはわかっていますが、
式<機能<...>>
ここで説明されていることはどちらでも機能します。
ここで正気を保つためにwhere句を単純化すると、
式に入れるので、私は試しました:
これはコンパイルされているように見えますが、whereステートメントが機能しないようです。次のことを試しました。
しかし、これによりコンパイル時エラーが発生します。
タイプ'System.Linq.Expressions.Expression>'を'bool'に暗黙的に変換することはできません
何か案は?また、これが機能すると仮定して、Expression <Func <>>のラムダ式を拡張して他の条件を含めることはできますか?
vb.net - LINQ と VB.NET、およびコンパイルされた式ツリーが SubSonic 3 を壊している
私は、VB.NET とそれが生成するのが好きな式ツリーに関する小さな問題を解決しようとしています。
簡単なテストがあります...
それが機能すると予想されるかもしれませんが、item.EmployeeID = 1
ビットに問題があり、これは VB.NET のみの問題であり、C# の問題ではありません。item.EmployeeID
VB.NET は、 null 許容であるため、コンパイルする式ツリーを賢く使用するのが好きです! (これに関連するブログを読む)
問題は、式が式ノードitem.EmployeeID = 1
でラップされることです。Convert
その時点で、TSql ジェネレーターは完全に失われ、次のWHERE
句が作成されます。
そのスニペットは、データベースで実行されると多少失敗する傾向があります。
これは SubSonic のバグのようです。残念ながら、それを修正する方法/場所を見つけようとしているのは私の頭です!
しかし、それはより面白くなります。
しかし、そのWHERE
条項は...
それは次善のようです!しかし、少なくともそれは機能します。
最後に、ブログ エントリを読んだ後、上記の元の例の回避策があるようです。VB.NET で新しい合体演算子 (If) を使用する...
このWHERE
句を生成するのは...
ISNULL
とは対照的に使用することには違いがありますが、もう少し簡潔なクエリCOALESCE
です。おそらく、SQL のバージョン間の互換性に関してのみです。
基本的には、最初の例をそのまま動作させたいと思っています。また、2 番目の例が機能し続け、よりクリーンな SQL が生成されるようにしたいと考えています。
私はこれを自分で修正したいと思っていますが、VB.NET 式ツリーの生成に問題があることを認識する以外に、あまり進んでいません。
.net - ダイナミック VB.net コードの書き方
たとえば、クラスを取得し、独自のプロパティを取得し、クラスの名前と呼び出されるプロパティの名前を関数に渡しています
たとえば、exp は、値 = "ClassA,Property1" を含む、渡している変数であるとします。
上記のようなことをしたいです。
c# - LINQ-to-SQL コンパイル済みクエリの問題 (コンパイルされていないクエリとして機能)
IQueryable
たとえばFindNewCustomers()
、FindCustomersRegisteredAfter(int year)
LINQ to SQL のクエリを「チェーン」するために使用するC# 拡張メソッドなどがあります。
今私の問題に:私はコンパイルされたクエリを作成したい、例えば:
FindCustomersRegisteredAfter(int year)
メソッドは、 を受け取って返す拡張メソッドですIQueryable
。このOrderBy
メソッドは、文字列に基づいて動的な式を作成する拡張メソッド (System.Linq.Dynamic) でもあります (たとえば、"FirstName ASC" はフィールド FirstName を昇順で並べ替えます)。Skip
およびTake
は組み込みメソッドです。
上記(コンパイルされたクエリではなく、通常のクエリ)は完璧に機能します。コンパイルされたクエリに入れると、次のエラーが発生します。
メソッド 'System.Linq.IQueryable`1[Domain.Customer] FindCustomersRegisteredAfter[Customer](System.Linq.IQueryable`1[Domain.Customer], Int32)' には、SQL への変換がサポートされていません。
繰り返しになりますが、クエリがコンパイルされていない場合、これは完全に機能し、通常の LINQ クエリだけです。エラーは、CompiledQuery.Compile() 内にある場合にのみ表示されます。
ヘルプ??!
編集: var query = (...) CompiledQuery.Compile の内部と同じ方法でクエリを作成すると、次の SQL が生成されます。
これで、SQL はすべて完全に変換可能であることがわかります。これを繰り返し実行するには、@p0、@p1、および @p2 を入力するだけで済みます。CompiledQuery.Compile の何が問題になっていますか?!?
更新: OrderBy が機能しないことを理解しています (@p パラメータではないため)。ただし、 CompiledQuery.Compile が拡張メソッドで機能しない理由をまだ理解しようとしています。このトピックに関するインターネット上の情報は事実上存在しません。
c# - LINQ式ツリーでスタンドアロンのブール式を評価する方法
動的SQLWHERE句を生成するために、標準のビジターパターンを使用してLINQ式ツリーを反復処理しています。
私の問題は、C#とは異なり、SQLでスタンドアロンのブール式を使用できないことです。1または0と比較する必要があります。
この架空のラムダ式を考えると:
このコードを誤って生成するのは簡単です。
またはこのコード:
もちろん、どちらもSQLエラーを生成します。サブツリーを深く掘り下げてケースがどうなるかを理解するときに、コードが本当に鈍く見え始めることなく、これを回避するためにどのロジックを適用する必要がありますか?
編集:上記の例はもちろん冗長です-私はポイントを説明するためにそれを使用しているだけです。
このシナリオを作成できる例:
当然、その最後の例は貧弱なスタイルですが、私のコードはプログラマーのスキルレベルとは無関係に機能するように設計されているため、冗長なシナリオに対応しないことは私の側では貧弱な形式になります。
lambda - 任意のタイプのノードをルートとする式ツリーを宣言的に構築します
MSDN は次のように述べています。
コンパイラは、式ツリーを構築することもできます。コンパイラによって生成された式ツリーは、常に Expression<TDelegate> 型のノードをルートとします。つまり、そのルート ノードはラムダ式を表します。
しかし、MethodCallExpression、BinaryExpression などのタイプのノードをルートとする式ツリーを構築したい場合はどうすればよいでしょうか? そして、これを手動で行いたくありません。
c# - ラムダ式の C# スイッチ
ラムダ式にスイッチを入れることは可能ですか? そうでない場合、なぜですか?Resharper はそれをエラーとして表示します。
c# - クエリフィルター式ツリーのパーサー
クエリフィルターを操作できるパーサーを探しています。ただし、用語がよくわからないので、大変な作業になっています。誰かが私を助けてくれることを願っています。「再帰下降パーサー」について読んだことがありますが、これは私が探している論理式の評価ではなく、本格的な言語パーサー用であるのではないかと思います。
理想的には、.NETコード(C#)だけでなく、T-SQLで機能する同様のパーサーも探しています。
私が欲しいのは何かを解析することです例えば:
((a = b)|(e = 1))&(c <= d)
理想的には、演算子は定義可能であり(たとえば、'<' vs'lt'、'=' vs'==' vs'eq'など)、関数型ラベルを指定できます(たとえば、(left(x、1)= 'e'))。パーサーはこれをロードし、順序の優先順位に従い(理想的には角かっこがないことを処理します)、ブール結果に評価する式を使用してコードにコールバックします(例:'a = b'?)。パーサーが式のカスタム関数を理解することは期待していません(ただし、文字列の分割など、いくつかの基本的な関数は便利です)。式を(左側と右側の部分に)分割すると便利です。
パーサーは、最終結果を計算するために最小限の質問をすることが望ましいです。たとえば、ANDの一方の側が偽の場合、もう一方の側を評価する意味はなく、最も簡単な側を最初に評価します(つまり、上記の式、'c <= d'はより高速であると想定されるため、最初に評価されます。
これはやるべきことがたくさんあると想像できますが、かなり一般的です。誰かが私に何か指針を与えることができますか?上記のように柔軟なパーサーがない場合、最初に使用できる基本的なパーサーはありますか?
どうもありがとう
リー
c# - C# ラムダ式のリファクタリング
Expression<Func<User,bool>>
プロパティを共有する式がいくつかあります。例えば、
u.IsActive && u.Group != "PROCESS"
を変数に入れて e1、e2、e3 で使用する簡単な方法はありますか? 編集済み:そして、私はまだ同じツリーが欲しい.
etcで式を作成することでできるようですがExpression.Lambda<Func<User, bool>>(BinaryExpression.AndAlso(
、コードを単純化するのではなく、読みにくくしました。