【问题标题】:EF4.1 - recursive query to get hierarchical dataEF4.1 - 递归查询以获取分层数据
【发布时间】:2011-09-22 22:56:46
【问题描述】:

我想出了这个:

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

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

【问题讨论】:

  • 是的,它返回集合,因为它返回您的 GetHierarchy 的返回类型。迭代器不嵌套。

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


【解决方案1】:

看看query hierarchical data这个出色的解决方案

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

【讨论】:

  • 如果您不打算将自己束缚于一种数据库实现并且仅支持树,那么此解决方案不可行,那么图形(多对多)层次结构呢?
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2014-10-27
    • 1970-01-01
    • 2017-02-16
    • 2017-05-11
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多