3
我试图用Linq/LinqKit构建一个嵌套的查询。理论上这似乎很容易。但我坚持实用的部分。使用Linq(套件)嵌套数据的StackOverflowException
在我的数据库中,我有一个表格,它有一个自引用其父。在我的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被无限嵌套直到堆栈已满。
任何想法如何做到这一点或者这是不可能的?或者还有其他方法在一个查询中使用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[]{};
嗨,有趣的尝试!但是,不可以创建具有未知最大嵌套级别的可扩展(EF兼容)递归表达式,因为没有等效的SQL CTE。 –
@IvanStoev,如果我知道嵌套的最高级别怎么办?已经尝试传递每次递归调用递减的深度参数。但是这里同样的例外 – KingKerosin