【问题标题】:Recursive IQueryable Linq Extensions method递归 IQueryable Linq 扩展方法
【发布时间】:2011-02-04 12:42:18
【问题描述】:

我对编写 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?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      【讨论】:

      • 我知道如何使用 Linq to Objects(您正在引用的页面)编写此内容。问题是关于为 Linq to SQL (IQueryable) 编写它
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-04
      • 2011-01-09
      • 2015-08-28
      • 1970-01-01
      相关资源
      最近更新 更多