0

我想出了这个:

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:

然后我发现了这一点: 一些有助于理解“产量”

所以我改变了我的方法:

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?)

至此,我完全不知道为什么会发生此异常。我可能错了,但对我来说,它看起来像是返回集合而不是单个项目。

4

2 回答 2

4

是的,它返回集合,因为它返回您的GetHierarchy. 迭代器不嵌套。你需要类似的东西:

public IEnumerable<Forum> GetHierachy(Forum forum)
{
    yield forum;

    foreach (var x in forum.SubForums.SelectMany(s => GetHierarchy(s)))
    {
        yield return x;
    }
}

当我看到这个查询时,我绝对不喜欢它。它很难看,而且性能会非常糟糕,因为这将使用延迟加载来加载数据 = 对数据库的大量查询。层次查询应直接在数据库中使用公用表表达式完成。

于 2011-06-26T13:31:03.510 回答
0

看看这个查询分层数据的优秀解决方案

它可能需要一些数据库更改,但值得。

于 2011-10-06T21:55:00.657 回答