我有以下代码,我正在尝试使用EF构建一个分层/父子关系模型:
ICollection<Content> contentList = _dbset.Where(
content =>
content.CompanyId == companyId && content.ParentContentId == null && content.Deleted == false)
.OrderBy(content => content.SortLevel)
.Include(content => content.SubContent.Select(childContent => childContent.SubContent)).ToList();在此场景下,如何使用EF构建父子树?
发布于 2012-04-25 22:28:02
因为EF跟踪加载到数据库上下文中的所有对象,除非在实际查询上关闭跟踪,否则可以加载构建上下文树所需的所有记录,然后在前一个结果集/集合上编写一个linq查询,通过在查询上指定父id来过滤所有子>孙记录。E.g
ICollection<object> treeList = <dbcontent>.<entity>.All().ToList();
treeList = treeList.Where(o => o.ParentId == 0).ToList();发布于 2012-04-16 15:43:11
所以你基本上有n个孩子,他们有更多的孩子?如果你不想使用太多的函数,为什么不使用一个递归函数呢?
我之所以问你是否有太多的函数,如果你最终递归一个函数足够多的次数,你可能会得到一个异常。但是..。这需要很深的深度。
发布于 2012-04-16 16:26:22
也许你可以通过一个固定点运算符尝试一下递归操作:
// static fixpoint operator (highly reusable)
public static Action<T> ActionFix<T>(Func<Action<T>, Action<T>> f)
{
return t => f(ActionFix(f))(t);
}
// your recursive ordering
foreach (var parentContent in contentList)
{
ActionFix<Content>(
actionContent =>
content =>
{
// ordering on the subContent of the node
content.SubContent = content.SubContent.OrderBy(sc => sc.SortLevel).ToList();
// recursive ordering on each element on the subContent
content.SubContent.ToList().ForEach(actionContent);
})
(parentContent);
}https://stackoverflow.com/questions/10169872
复制相似问题