LINQ プロバイダーを階層データ ソースに記述しています。API をどのように使用したいかを示す例を作成し、それらのユース ケースをサポートするようにコーディングすることで、API を設計するのが最も簡単だと思います。
私が問題を抱えていることの1つは、LINQステートメントで「深いクエリ」または再帰を表現する簡単/再利用可能/エレガントな方法です。言い換えれば、次のものを区別する最良の方法は何ですか。
from item in immediate-descendants-of-current-node where ... select item
対:
from item in all-descendants-of-current-node where ... select item
(編集:上記の例のどちらも、必要なクエリの構造を必ずしも反映していないことに注意してください。再帰/深さを表現する良い方法に興味があります)
このようなプロバイダーを実装する方法や、再帰を可能にする方法で IQueryable または IEnumerable を記述する方法を尋ねているわけではないことに注意してください。LINQ クエリを作成し、プロバイダーを利用している人の立場から質問しています。再帰するかどうかを直感的に表現する方法は何ですか?
データ構造は一般的なファイル システムに似ています。フォルダーにはサブフォルダーのコレクションを含めることができ、フォルダーにはアイテムのコレクションを含めることもできます。したがって、myFolder.Folders は myFolder の直接の子であるすべてのフォルダーを表し、myFolder.Items には myFolder 内のすべてのアイテムが含まれます。以下は、フォルダーとページを含むファイルシステムによく似た、サイト階層の基本的な例です。
(F)Products
(F)Light Trucks
(F)Z150
(I)Pictures
(I)Specs
(I)Reviews
(F)Z250
(I)Pictures
(I)Specs
(I)Reviews
(F)Z350
(I)Pictures
(I)Specs
(I)Reviews
(I)Splash Page
(F)Heavy Trucks
(F)Consumer Vehicles
(I)Overview
私が書く場合:
from item in lightTrucks.Items where item.Title == "Pictures" select item
クエリがライト トラックの下にあるすべてのアイテムを取得する、またはすぐ近くのアイテムのみを取得するという意図を表現する最も直感的な方法は何ですか? 2 つの意図を区別するための、最も侵入的でなく、摩擦の少ない方法は?
私の一番の目標は、この LINQ プロバイダーを、LINQ を平均的に理解している他の開発者に引き渡し、再帰ラムダの作成に関するチュートリアルを提供することなく、再帰クエリとリスト クエリの両方を作成できるようにすることです。良さそうな使い方があれば、それに対してプロバイダーをコーディングできます。
追加の説明: (私はこれを伝えるのが本当に苦手です!) - この LINQ プロバイダーは外部システムに対するものであり、単にオブジェクト グラフをウォークするだけではありません。また、この特定のケースでは、再帰式が実際にあらゆる種類の真の再帰アクティビティに変換されることもありません。フードの下。「深い」クエリと「浅い」クエリを区別する方法が必要なだけです。
では、どう表現するのがベストだと思いますか?それとも、私が見逃した標準的な表現方法はありますか?