問題タブ [custom-linq-providers]
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# - IQueryable のクエリ テキストを取得する方法この演算子が呼び出されるインスタンス?
このためのプロバイダーの実装はそれほど難しくありません。
しかし、次のように 2 つの演算子をチェーンすると、次のようになります。
または私がこれをした場合:
これをどのように実装しますか?
で現在のメソッド呼び出しまたは演算子を評価するVisitMethodCall
際に、メソッド呼び出しが行われるインスタンス / オブジェクト / 式にアクセスします。そのVisitConstant
インスタンス式を評価/翻訳/書き直す必要があります。
次に、VisitConstant
これを行う場合:
うまくいきません。
以前に作成したクエリのクエリ テキストを取得するにはどうすればよいですか?
linq - System.Linq.Expressions.Expression.CanReduce プロパティの意味は何ですか?
ドキュメントとその名前が暗示していることからCanReduce
、さらに小さな式に分解できるすべての式に対して、プロパティの値を true に設定する必要があると推測できます。
しかし、よく観察すると、この推論はすべての場合に当てはまらないようです。の場合を考えてみましょうLambdaExpression
。これは確かに複合単位です。ただし、LambdaExpression
クラスから直接派生するクラスは、プロパティExpression
をオーバーライドしません。CanReduce
このExpression
クラスは、CanReduce
を返す実装を使用してプロパティを virtual として定義してfalse
いるため、ラムダ式はこれ以上簡約できないことを暗示していますが、これは正しくありません。
では、このプロパティの本当の意味は何ですか?
c# - なぜ LambdaExpression を引用するのですか?
私はこの回答を読み、それが強調する特定のケースを理解しました。これは、別のラムダ内にラムダがあり、誤って内側のラムダも外側のものとコンパイルしたくない場合です。外側のラムダ式をコンパイルするとき、内側のラムダ式を式ツリーのままにしておく必要があります。そうです、内側のラムダ式を引用するのは理にかなっています。
しかし、それはそれについてです、私は信じています。ラムダ式を引用する他のユースケースはありますか?
そうでない場合、すべての LINQ 演算子、つまり、クラスIQueryable<T>
で宣言されている拡張機能がQueryable
、その情報を にパッケージ化するときに引数として受け取る述語またはラムダを引用するのはなぜですかMethodCallExpression
。
私は例 (および過去数日間の他のいくつか) を試しましたが、この場合、ラムダを引用する意味がないようです。
唯一のパラメーターとして (デリゲート インスタンスではなく) ラムダ式を期待するメソッドへのメソッド呼び出し式を次に示します。
MethodCallExpression
次に、ラムダ内にラップしてコンパイルします。
LambdaExpression
しかし、それは内部(メソッドへの引数)もコンパイルしませんGimmeExpression
。内部ラムダ式を式ツリーとして残し、そのデリゲート インスタンスを作成しません。
実際、引用せずにうまく機能します。
そして、引数を引用すると、それが壊れて、間違ったタイプの引数をメソッドに渡していることを示すエラーが表示されますGimmeExpression
。
どうしたんだ?この引用は一体何ですか?
c# - F# から LINQ プロバイダーを使用するには?
C# (同じ AST) と同じように動作するように、プロバイダー (LINQ to NHibernate など) を使用するときに F# で LINQ クエリを使用する適切な方法は何ですか?
私の特定の問題は、クエリを F# に変換すると、C# が機能している間にエラーがスローされることです。これは、F# が同じ AST を生成しないことが原因である可能性があります。Roslyn は C# 用の Visual Studio AST ビジュアライザー拡張機能を提供していますが、F# 用の AST ビューアーは知りません。
次の作業 C# クエリを持つ:
F# に変換すると:
次のエラーで失敗します。
ただし、 を使用.First(fun someEntity -> someEntity.SomeReferenceType <> null)
すると正しく動作し、上記の結論につながり.HasValue
ます。
sql - 特定の値を持つ xml 属性の XML フィールドを検索するためのカスタム linq プロバイダー
NHibernate を介してやり取りするデータベース テーブルの一部には、次の構造を持つ XML フィールドが含まれています。
基本的に、各「C」タグには属性が含まれており、その名前はタグ「N」に含まれ、値はタグ「V」に含まれています。
私が達成したいのは、クエリでこの種の LINQ 構文を記述できるようにすることです。
「 attribute_value」で指定された文字列値を持つ「 attribute_name 」という名前の属性が XML フィールドに含まれている特定のテーブルのエンティティを取得できるようにします。
それと同じくらい単純です。XML 構造は常にそのようなものであり、特定の値を持つ単一の属性を照会するだけで済みます。
検索を行うと、カスタム LINQ プロバイダーを実装するための特定の手法があることがわかりました。
- http://www.primordialcode.com/blog/post/nhibernate-3-extending-linq-provider-fix-notsupported例外
- http://fabiomaulo.blogspot.it/2010/07/nhibernate-linq-provider-extension.html
- Linq-to-Nhibernate が特定の列に対して生成する SQL を変更するにはどうすればよいですか?
残念ながら、ツリービルダーの使用方法に関する構造化されたドキュメントを見つけることができなかったので、現時点ではこれが私が持っているものです:
このようなタスクを実行するための正しい HQL を見つけました。
LINQ クエリ内で呼び出すメソッド:
HQL との統合部分:
ご覧のとおり、ツリービルダーを訪問者オブジェクトと共に適切に使用して、上記の HQL 構文を複製する方法をまだ理解していません。誰かがこれで私を助けてくれますか、少なくともツリービルダーの使用法に関するいくつかの基本的なドキュメントを教えてくれますか? ありがとう