递归IQueryable Linq扩展方法

时间:2011-02-04 12:42:19

标签: c# sql linq-to-sql extension-methods

我有兴趣编写IQueryable接口的扩展方法。该方法将以递归方式返回指定选择器的所有子项。

public static class MyExtensions
{
    public static IQueryable<IRecursion<T>> SelectRecursive<T>(this IQueryable<T> source, Func<T, IQueryable<T>> selector)
    {
        //Code goes here
    }

    public interface IRecursion<T>
    {
        int Depth { get; }

        T Item { get; }
    }
}

使用示例:

var allChildren = tblCompanies
        .Where(c => c.pkCompanyID == 38)
        .SelectRecursive(p => tblCompanies.Where (c => c.pkCompanyID == p.fkCompToCompID));

函数生成的SQL代码就是这样的。

WITH CompanyCTE(ID, parentID, depth) AS
(
    SELECT
        pkCompanyID, 
        fkCompToCompID,
        0
    FROM 
        tblCompany

    UNION ALL

    SELECT
        tblCompany.pkCompanyID, 
        tblCompany.fkCompToCompID,
        CompanyCTE.depth + 1
    FROM 
        tblCompany
        JOIN CompanyCTE ON tblCompany.fkCompToCompID = CompanyCTE.ID
)
SELECT
    tblCompany.*, --Item
    CompanyCTE.depth --Depth
FROM 
    CompanyCTE
    JOIN tblCompany ON CompanyCTE.ID = tblCompany.pkCompanyID
WHERE
    parentID = 38

可以吗? 如果CTE不可能,可能使用SQL 2008 hierarchyid?

2 个答案:

答案 0 :(得分:1)

这在L2S中是不可能的。但是,如果这对您来说足够了,您可以将查询扩展到某个恒定深度。这将导致一个讨厌的连接森林。

由于您的“公司”集合可能不是很大,请尝试加载所有这些“公司”并执行此客户端。

答案 1 :(得分:0)