再帰的にLINQを行うには、私が知っている唯一の方法は、不動点演算子を使用することです(下記参照)
しかし、私はある、(@erikkallen答えを参照)EFは、CTEのクエリにこれを変換することができないだろう私は1つのステートメントで再帰的クエリを行うことを知っている唯一の方法です。
class Page
{
IQueryable<Page> ChildPages;
string type; //catalog or product
// the query
static IQueryable<Page> GetProductsWithCatalogAncestor(IQueryable<Page> pages)
{
return FixPoint<bool, IQueryable<Page>, IQueryable<Page>>
(processChildPages => (hasCatalogAncestor, thePages)
=> thePages.SelectMany(p => (hasCatalogAncestor && p.type == "product")
? new[] { p }.AsQueryable()
: processChildPages(hasCatalogAncestor || p.type == "catalog", p.ChildPages)))
(false, pages);
}
// Generic FixPoint operator
static Func<T1, T2, TResult> FixPoint<T1, T2, TResult>(Func<Func<T1, T2, TResult>, Func<T1, T2, TResult>> f)
{
return (t1, t2) => f(FixPoint(f))(t1, t2);
}
}
出典
2012-05-03 15:37:59
jbl
あなたは、「ページ」、「ChildPage」、「製品」、「カタログ」の単語を使用し、そして「サブカテゴリ」1人の関係を記述するために、私は、私はかなり混乱していると告白しました。 –
あなたの質問には、少し明確にするために「リファクタリング」が必要です。 –
あなたは再帰やループなしでこれを行うことはできません。どんな深さで子孫の子ページをもらうにはどうしたらいいですか? –