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を使用していますか?
私はLinqをObject(参照しているページ)に書き込む方法を知っています。質問はLinq to SQL(IQueryable)のために書いておきます。 – Magnus