LINQ 式ツリーで統計データを収集する単純なクラスIQueryable
とクラスを実装しました。IQueryProvider
この部分は正常に動作します。次に、評価のために式ツリーを既定の LINQ-to-Objects プロバイダーに渡したいと思います。別の方法で実行する必要はないからです。言い換えれば、プロバイダーが副作用として統計を収集し、クエリを既定の LINQ 実装に渡すようにしたいと考えています。
ただし、デフォルトのプロバイダーへのハンドルを取得するのに苦労しています。IEnumerable
元のコレクションへの参照を単純に保存し、次のように (カスタムからIQueryable
)デフォルト プロバイダーを返すことができると考えました。
IQueryProvider IQueryable.Provider
{
get { return _my_provider.OriginalIEnum().AsQueryable().Provider; }
}
しかし、これは正しく機能しません。コードは最終的にStackOverflowException
. 私が考えていること (デバッグ モードでのシングル ステップから収集) は、LINQ ランタイムが上記のメソッドからプロバイダーを取得し、次に custom から式ツリーを取得IQueryable
し、最上位の式が私のカスタムIQueryable
。そのため、プロセスを最初からやり直して、適切なプロバイダーを見つけようとします。これは、スタック オーバーフローが発生するまで際限なく行われます。
IQueryable
現時点では、LINQ ランタイムが既定のプロバイダーを呼び出すように、カスタム ノードが削除された別の式ツリーを生成する別のビジターを考え出すことしか考えられません。Call
カスタムIQueryable
を再度呼び出すネストされた式がないことを確認するために、すべてのリーフにアクセスする必要があるため、これはかなりの量の作業です。より簡単なアプローチはありますか?
助けてくれてありがとう。