6

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を再度呼び出すネストされた式がないことを確認するために、すべてのリーフにアクセスする必要があるため、これはかなりの量の作業です。より簡単なアプローチはありますか?

助けてくれてありがとう。

4

1 に答える 1