私は次のテーブル形式を持っています
Id (int)
ParentId (int)
ParentId = Idであるが、複数回ネストされているように、相互に関連するすべての行をクエリする必要があります
私はこれに取り組む方法に少しこだわっています、私はストアドプロシージャに戻るかもしれませんが、私は本当にこれを純粋なlinqtosqlで試してみたかったのです。
私は次のテーブル形式を持っています
Id (int)
ParentId (int)
ParentId = Idであるが、複数回ネストされているように、相互に関連するすべての行をクエリする必要があります
私はこれに取り組む方法に少しこだわっています、私はストアドプロシージャに戻るかもしれませんが、私は本当にこれを純粋なlinqtosqlで試してみたかったのです。
2つの選択肢があると思います。
親を明示的にフェッチする必要があるため、dbへの個別の呼び出しが多数発生します。この種のアーキテクチャ(dbからの1回の呼び出しで自己参照データを再帰的にフェッチする)は、L2SまたはL2Eではサポートされていないと思います。
これらのシナリオでは、データベースのネイティブ機能(この場合はCTE )を使用する傾向があります。カスタムSQLクエリを使用し、。を使用して戻りタイプを定義することもできますdb.ExecuteQuery<ReturnType>
。SQL Server 2005以降を使用している場合は、次の構文を使用できます。
var allGroups =
db.ExecuteQuery(
@"WITH n(Id, ParentId) AS
(SELECT Id, ParentId
FROM MyTable
WHERE Id = {0}
UNION ALL
SELECT nplus1.Id, nplus1.ParentId
FROM MyTable as nplus1, n
WHERE n.ParentId = nplus1.Id)
SELECT Id, ParentId FROM n",
firstChildId).ToList();
このようにして、1回の呼び出しですべてのエンティティをフェッチしました。SQLServerで上位再帰的な自己結合を行う方法を確認してください。SQL Serverで再帰的な自己結合を行う最も簡単な方法は?。