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 に答える