4

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[]{};
4

1 に答える 1