1

我有一个嵌套结构。

类页面有 ChildPages

class Page
{
 IQueryable<Page> ChildPages;
 string type; //catalog or product
}

我需要获取所有子类别(type=="catalog")中所有产品(type=="product")的样本请求。

循环和递归很容易做到。但这需要大量的时间和资源

4

3 回答 3

1

我认为 EF 不支持这一点,但您可以使用递归 CTE 查询在一次数据库调用中检索整个树。

于 2012-05-03T14:55:17.313 回答
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);
    }
}
于 2012-05-03T15:37:59.637 回答
-1

尝试使用SelectMany()扁平化层次结构。

var data = pages.SelectMany(p=>p.ChildPages)
                .Where(p=>p.type == "product" || p.type == "catalog");
于 2012-05-04T09:48:50.763 回答