我想出了这个:
public partial class Forum
{
public List<Forum> GetHierachy(Forum foru)
{
foreach (var forum in foru.SubForums.ToList())
{
yield return GetHierachy(forum);
}
}
}
为此:
public partial class Forum
{
public int Id { get; set; }
public int SubForumId { get; set; }
public virtual ICollection<Forum> SubForums { get; set; }
public virtual Forum ParentForum { get; set; }
}
我明白了:
The body of 'Jami.Data.Forum.GetHierachy(Jami.Data.Forum)' cannot be an iterator block because 'System.Collections.Generic.List<Jami.Data.Forum>' is not an iterator interface type:
然后我发现了这个: Some help understanding "yield"
所以我把方法改为:
public IEnumerable<Forum> GetHierachy(Forum foru)
{
foreach (var forum in foru.SubForums.ToList())
{
yield return GetHierachy(forum);
}
}
现在我失去了施法异常。
Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<Jami.Data.Forum>' to 'Jami.Data.Forum'. An explicit conversion exists (are you missing a cast?)
这一点我并不知道为什么会发生这种异常。我可能错了,但对我而言,它看起来像是回归收藏而非单品。
答案 0 :(得分:4)
是的,它返回集合,因为它返回GetHierarchy
的返回类型。迭代器不嵌套。你需要这样的东西:
public IEnumerable<Forum> GetHierachy(Forum forum)
{
yield forum;
foreach (var x in forum.SubForums.SelectMany(s => GetHierarchy(s)))
{
yield return x;
}
}
当我查看此查询时,我绝对不喜欢它。它很丑陋,它会执行非常糟糕,因为这将使用延迟加载来加载数据=对数据库的大量查询。应使用Common表表达式直接在数据库中完成分层查询。
答案 1 :(得分:0)
可能需要进行一些数据库更改但值得。