2011-02-04 19 views
3

IQueryableインターフェイスの拡張メソッドを書くことに興味があります。このメソッドは、指定されたセレクタのすべての子を再帰的に返します。再帰的IQueryable Linq拡張メソッド

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を使用していますか?

答えて

1

これはL2Sは不可能です。ただし、クエリが一定の深さに拡張されていれば十分です。これにより、厄介な結合の森ができます。

あなたの「企業」のセットはおそらくそれほど大きくないので、すべてを読み込んでこのクライアント側で実行してください。

関連する問題