Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 递归可量化Linq扩展方法_C#_Sql_Linq To Sql_Extension Methods - Fatal编程技术网

C# 递归可量化Linq扩展方法

C# 递归可量化Linq扩展方法,c#,sql,linq-to-sql,extension-methods,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) {

我对编写扩展方法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; }
    }
}
函数生成的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?

请参见以下内容:


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


由于您的“公司”集合可能不太大,请尝试加载所有公司,并在客户端执行此操作。

我知道如何使用Linq将其写入对象(您正在引用的页面)。问题是如何为Linq到SQL(IQueryable)编写它
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