2016-02-09 9 views
5

F# 4.0 specを通して読むと、私は、PDFの79ページで、次のを見ました:カスタム計算式ビルダーでBuilder.Source()を使用する理由は何ですか?

補助機能src(e)は、最も内側のForEachは、翻訳によって生成された代わりに、ユーザーコードからのものである場合b.Source(e)を示し、ビルダーb方法はSourceです。それ以外の場合、src(e)eを示します。

これは、計算式がどのように解析され、式のビルダーオブジェクトに対する一連のメソッド呼び出しになるかについての詳細な(非常に詳細な)説明の文脈にある。私は私が、計算式の背後にある概念の残りの部分を理解Source方法を言及していない、また私は見つけることができました、他の参照を行ううえで非常に貴重であることが判明しScott Wlaschin's Computation Expressions series、。 (たくさんの人がソースコードについて話をしており、Sourceメソッドへの参照が埋もれているので、Googleはあまり役に立ちません)。

は、MSDN page on computation expressionsのどこにも記載されていません。 QueryBuilder classSourceを使用していますので、私が見ることができる1つの例がありますが、これが他の状況でなぜ有用であるのかについての説明はありません。

カスタム計算式ビルダにSource方法を持っているしたいどのような状況下では?デフォルトのForEachの処理が自分のニーズに不十分で、Sourceメソッドが不適切な場合、どのようなシナリオが役立ちますか?

+0

@mydogisbox - リンクありがとうございます。 'source'が' in'節の内容で呼び出されていることに気付きました。つまり 'for item in'は 'Source(x)'を呼び出します。そして私は、 'Source'が' For'に入るのに適した何かを返すべきであることを理解します。私は、なぜ、どうして*見ないのですか? 'QueryBuilder.Source'は、IEnumerableかIQueryable(IEnumerableを継承します)のいずれかを要求します。どちらも、反復処理のための' For'関数に適しています。だから、なぜここで 'ソース'呼び出しが必要ですか?なぜ、「彼らは私にIEnumerableを与えたので、それを反復処理しますか? – rmunn

+0

私たちは同じことを話していると思いますが、私が何を意味するのかを説明するのに十分なスペースがありませんでした。私が話している 'For'は 'QueryBuilderです。For'は、 'query''の' for'式を処理するために呼び出され、db.Customersではcustomerを選択します。 – rmunn

答えて

4

私はこれについて内部的な知識を持っていませんが、ここには、翻訳と実装に基づいて、QueryBuilderに基づいてメソッドが存在すると考えられる理由があります。 IEnumerable又はIQueryableいずれか - QueryBuilder

すべての操作は'R、要素のタイプであり、'Qは、データソースの一種であるQuerySource<'R, 'Q>を使用してデータソースを表します。最後にRun方法はIEnumerableためとIQueryableのためのさまざまなことを行う必要があるため、それ以外の場合は必要とされるであろう -

ただ一つのデータ型が存在するという事実は、それがIQueryableIEnumerableのための別のオーバーロードを定義する必要がないことを意味します。

したがって、Sourceメソッドを使用すると、クエリが処理できるすべての入力をデータソースの「内部表現」に変換できます。反対側では、Runメソッドは、この内部表現から通常の値にデータを変換します。 (QueryBuilderの場合は、自分のコードにQuerySourceのタイプが表示されません)。

+0

"' Source'メソッドは、クエリが処理できる入力を何らかの形でデータソースの "内部表現"に変換することができます。反対に、 'Run'メソッドはデータをこの内部表現から通常の値に変換します" - これは私に「クリック」された文章でした。ありがとう、それは私が必要とした説明だった。 – rmunn

関連する問題