EF4.1 - 递归查询以获取分层数据

时间:2011-06-26 12:24:48

标签: entity-framework entity-framework-4.1 hierarchical-data recursive-query

我想出了这个:

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

这一点我并不知道为什么会发生这种异常。我可能错了,但对我而言,它看起来像是回归收藏而非单品。

2 个答案:

答案 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)

了解query hierarchical data

这个出色的解决方案

可能需要进行一些数据库更改但值得。