我想出了这个:
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?)A这一点我一点也不知道为什么会发生这种异常。我可能错了,但对我来说,它看起来像是返回集合,而不是单个项目。
发布于 2011-06-26 21:31:04
是的,它返回集合,因为它返回您的GetHierarchy的返回类型。迭代器不嵌套。你需要这样的东西:
public IEnumerable<Forum> GetHierachy(Forum forum)
{
yield forum;
foreach (var x in forum.SubForums.SelectMany(s => GetHierarchy(s)))
{
yield return x;
}
}当我看到这个查询时,我肯定不喜欢它。它很难看,而且性能非常差,因为这将使用延迟加载来加载数据=对数据库的大量查询。分层查询应该直接在数据库中使用常用表表达式来完成。
发布于 2011-10-07 05:55:01
看看这个优秀的query hierarchical data解决方案
这可能需要一些db修改,但这是值得的。
https://stackoverflow.com/questions/6483882
复制相似问题