我有一个嵌套结构。
班级页面有ChildPages
class Page
{
IQueryable<Page> ChildPages;
string type; //catalog or product
}
我需要得到我应该在所有子类别(type ==“catalog”)中获取所有产品(type ==“product”)的样本请求
循环和递归很容易。但它需要大量的时间和资源
答案 0 :(得分:1)
我认为EF不支持,但您可以使用递归CTE查询在一次数据库调用中检索整个树。
答案 1 :(得分:0)
我知道做递归Linq的唯一方法是使用Fixpoint运算符(见下文)
但我怀疑EF能否将其转换为CTE查询(请参阅@erikkallen答案),这是我知道在一个语句中执行递归查询的唯一方法。
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);
}
}
答案 2 :(得分:-1)
尝试使用SelectMany()
展平层次结构。
var data = pages.SelectMany(p=>p.ChildPages)
.Where(p=>p.type == "product" || p.type == "catalog");