私はLinq/LinqKitを使用してネストされたクエリを構築しようとしています。理論的にはこれは簡単だと思われる。しかし、私は実用的な部分に立ち往生しています。入れ子になったデータのLinq(キット)を使用してStackOverflowException
私のデータベースには、親に対する自己参照を持つテーブルがあります。私のlinq-queryでは、特定の要素(およびこの要素の親など)のすべての親を選択する必要があります。
public static Expression<Func<MyTable, IEnumerable<MyTable>>> Parents => (entity) => entity.ParentId != null ? new[]{entity.ParentEntity}.Union(Parents.Invoke(entity.ParentEntity) : new MyEntity[]{};
ParentId
が設定されている場合に特定のエンティティの親とそれらの親を選択する必要があります。私のコードで
私はMyTable
の部分クラスに次の式を持っています。
クエリ自体(簡体字):停止条件がヒットせず、スタックが満杯になるまで従ってParents
-callが無限にネストされているように、このコードを実行
dbContext
.MyTable
.AsExpandable()
.Where(x => x.Id == myId)
.Select(x => new
{
Parents = MyTable.Parents.Invoke(x, dbContext)
});
がStackOverflowException
で終わります。
どのようにこれを行うことができますかこれは不可能ですか?または、1つのクエリ内でLinq
/LinqKit
を使用してネストされたデータを取得するための他の方法がありますか?
私はすでにサブクエリ(も動作していない)を作成するために、式にコンテキストを渡してみました:
public static Expression<Func<MyTable, MyContext, IEnumerable<MyTable>>> Parents => (entity, dbContext) => entity.ParentId != null ? new[]{entity.ParentEntity}.Union(Parents.Invoke(dbContext.MyTable.FirstOrDefault(x => x.Id == entity.ParentId), dbContext) : new MyEntity[]{};
こんにちは、面白い試み!しかし、いや、それはSQL CTEのない相当するものがないため、ネストの未知の最高レベルの拡張性(EF互換)の再帰式を作成することはできません。 –
@IvanStoevは、私は、ネストの最大レベルを知っていたでしょうか?すでに各再帰呼び出しによってデクリメントされ、深さのparamを渡してみました。しかし、ここでも同じ例外 – KingKerosin