首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EF4.1 -用于获取分层数据的递归查询

EF4.1 -用于获取分层数据的递归查询
EN

Stack Overflow用户
提问于 2011-06-26 20:24:48
回答 2查看 2K关注 0票数 0

我想出了这个:

代码语言:javascript
复制
public partial class Forum
{
    public List<Forum> GetHierachy(Forum foru)
    {
        foreach (var forum in foru.SubForums.ToList())
        {
            yield return GetHierachy(forum);
        }
    }
}

为此:

代码语言:javascript
复制
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; }
}

我明白了:

代码语言:javascript
复制
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"

因此,我将我的方法更改为:

代码语言:javascript
复制
public IEnumerable<Forum> GetHierachy(Forum foru)
    {
        foreach (var forum in foru.SubForums.ToList())
        {
            yield return GetHierachy(forum);
        }
    }

现在我找不到强制转换异常了。

代码语言:javascript
复制
Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<Jami.Data.Forum>' to 'Jami.Data.Forum'. An explicit conversion exists (are you missing a cast?)

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-26 21:31:04

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

代码语言:javascript
复制
public IEnumerable<Forum> GetHierachy(Forum forum)
{
    yield forum;

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

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

票数 4
EN

Stack Overflow用户

发布于 2011-10-07 05:55:01

看看这个优秀的query hierarchical data解决方案

这可能需要一些db修改,但这是值得的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6483882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档