2011-02-04 8 views
0

私はいくつかの階層データを持っています。私が使用してモデルクラスは次のようになります。エンティティコード内の階層データの取得

public class Category 
{ 
    [Key] 
    public int CategoryID { get; set; } 

    [Required] 
    [StringLength(64)] 
    public string Name { get; set; } 

    public int? ParentCategoryID { get; set; } 
    [ForeignKey("ParentCategoryID")] 
    public Category ParentCategory { get; set; } 

    [Required] 
    public int ListOrder { get; set; } 


    // left/right 
    public int TreeLeft { get; set; } 
    public int TreeRight { get; set; } 
} // eo class Category 

私は自分のデータを格納するhereを概説技術を使用して、データを挿入し、取り出すことは問題ではありませんしました。私がやりたい何

、このクラスに分類コレクションを追加します:

public virtual IEnumerable<Category> {get; set; } 

私が取得するときに、関連するテーブルを含めるために、(MVCのチュートリアルから学んだ)過去にこの技術を使用しましたデータ。しかし、私はこれを試してみましたが、IEnumerable <>が抽象的であるというエラーを受け取りました(わかりました、フレームワークは私が何をしたいのか分かりませんでした)...

...確かにLINQの新機能であるLINQがどのように見えるかはわかりません。つまり、それぞれが子を内部に持つCategoryインスタンスのコレクションを返すことになります。

手動でリストを構築できると思いますが、通常のLINQクエリを使用して特定の位置(およびその子)のすべてのカテゴリを取得し、手動ですべてを取り込みます。

私はLINQがこれを行うことができるのだろうかと思っていましたか?

ありがとうございます!

+0

あなたは本当に継承を使いたくありませんか? – Euphoric

答えて

1

あなたがコレクションより、自己参照FKをお持ちの場合は、DBMLファイルに

をテーブルを追加し、このようになりますときに自動的に生成する必要があります。

[global::System.Data.Linq.Mapping.AssociationAttribute(Name="Category_Category", Storage="Categories", ThisKey="pkCategoryID", OtherKey="ParentCategoryID")] 
public EntitySet<Category> Categories 
{ 
    get 
    { 
    return this._Categories; 
    } 
    set 
    { 
    this._Categories.Assign(value); 
    } 
} 
+0

しかし、子カテゴリに子などがあるので、これは何らかの種類の再帰的LINQを必要としませんか?私は手作業で自分自身を投入することなくそれを行う方法を見ることができません。 –

+0

それはあなたに深さ1の子供を与えるだけです。あなたが子供たちの子供をも取得したい場合は、それを行うことができるlinq2sqlがないので、メモリ内に再帰関数を書くことをお勧めします。 – Magnus

+0

具体的なリストプロパティをCategoryクラスに追加して手動で入力するのが最善の方法ですか?私はそれをしても問題ありません。ツリー全体を取得して(順番に、再帰は必要ありません)、自分で作成することができます。 –

0

いけないIEnumerable<Category>が、Collection<Category>を使用します。それがあなたの問題であれば..