Linq/LinqKit を使用してネストされたクエリを作成しようとしています。理論的には、これは簡単なようです。しかし、私は実用的な部分にこだわっています。
私のデータベースには、親への自己参照を持つテーブルがあります。私のlinq-queryでは、特定の要素のすべての親(およびこの要素の親など)を選択したいと考えています。
私のコードでは、の部分クラスに次の式がありますMyTable
。
public static Expression<Func<MyTable, IEnumerable<MyTable>>> Parents => (entity) => entity.ParentId != null ? new[]{entity.ParentEntity}.Union(Parents.Invoke(entity.ParentEntity) : new MyEntity[]{};
が設定されている場合、特定のエンティティの親とそれらの親を選択する必要がありますParentId
。
クエリ自体 (簡略化):
dbContext
.MyTable
.AsExpandable()
.Where(x => x.Id == myId)
.Select(x => new
{
Parents = MyTable.Parents.Invoke(x, dbContext)
});
このコードを実行するStackOverflowException
と、停止条件がヒットしないためParents
、スタックがいっぱいになるまで -call が無限にネストされます。
これを行う方法、または不可能な方法はありますか? または、 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[]{};