0

私はこれを考え出すEF4.1再帰クエリは、階層的データを取得するために

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: 

Iこれを見つけた: 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?) 

この点私は、この例外がなぜ発生するのか、細かい考えがありません。私は間違っているかもしれませんが、私にとっては単一のアイテムではなくコレクションを返すように見えます。

+0

[yield(C#リファレンス)](http://msdn.microsoft.com/library/9k7k7cf0.aspx)を参照してください。 –

+0

はい、GetHierarchyの戻り値の型を返すので、コレクションを返します。イテレータはネストされません。 –

答えて

4

はい返品のタイプがGetHierarchyであるため、コレクションが返されます。イテレータはネストされません。

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

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

私はこのクエリーを見ると、間違いなくそれが好きです。それは醜いです、そして、それはデータを読み込むために遅延読み込み=データベースへの多くのクエリを使用するのでひどく悪い行います。階層的な照会は、共通テーブル式を使用してデータベース内で直接実行する必要があります。

0

は、それはいくつかのデシベルの変更を必要とするが、それにその価値があるかもしれquery hierarchical data

にこの優れたソリューションを見てください。

+1

データベースの1つの実装に縛られず、ツリーのみをサポートするつもりがない場合、グラフ(多対多)階層はどうでしょうか? –

関連する問題