我正在尝试使用 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)
});
运行此代码以 an 结束,StackOverflowException
因为未命中停止条件,因此Parents
-call 无休止地嵌套,直到堆栈已满。
有什么想法可以做到这一点还是不可能?或者是否有其他方法可以在一个查询中使用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[]{};