2011-01-06 8 views
4

私はデータを取得し、それをソート済み(親の下の子)に表示したいと思います。
データ項目は次のように定義されています。タイトル|親IDLinq-to-entitiesを使用して階層データを取り出す方法は?

まず、すべてのアイテムを取得してから並べ替えます。
linqでこれを行うより良い方法はありますか?

protected void Page_Load(object sender, EventArgs e) 
{   
    List<Category> list2 = new List<Category>(); 
    ContModel modeltx = new ContModel(); 

    var ret = modeltx.Categories.ToList(); 

    GetCategoryList(0, 0, ret, list2); 
    string str=""; 

    foreach (Category cat in list2) 
    { 
      str=str+cat.Title+"\n"; 
     TextBox1.Text = str; 
    }  
} 


    private void GetCategoryList(int iCurID, int iDepth, List<Category> li, List<Category> newList) 
    { 
     Category tmp; 
     string strOffset = ""; 

     foreach (Category cat in li) 
     { 
      if ((cat.ParentId) == iCurID) 
      { 
       for (int i = 1; i <= iDepth; i++) 
        strOffset = strOffset + "-"; 

       strOffset = strOffset + cat.Title; 

       tmp = cat; 
       tmp.Title = strOffset; 
       newList.Add(tmp); 

       strOffset = ""; 
       GetCategoryList(cat.CategoryID, iDepth + 1, li, newList); 
      } 
     } 
    } 

更新:

データのサイズが巨大であると私はページングを使用する場合になる方法?
ソート前にページ(.Skip(PageSize * PageIndex).Take(PageSize))を表示できません...

+0

可能性のある複製http://stackoverflow.com/questions/202912/hierarchical-data-in-linq-options-and-performance – too

答えて

0

コード内でLINQ結果を再帰的に処理する必要があります。テーブルのサイズと構造によっては、テーブル全体をメモリにプルダウンして(そのように見えるように)、階層がそこを歩くようにすることができます。非常に大きなテーブルがある場合は、DBへの繰り返しの移動が必要な場合があります。

詳細については、この偉大な記事をお読みください。Storing Hierarchical Data in a Database

あなたのコードが既にメモリに平坦化を行っています。 list2オブジェクト(フラット化されたデータ)にSkip(pSize * pIndex).Take(pSize)というデータを使用することをお勧めします。これは、階層の深いページ区切りにつながる可能性があることに注意してください。

+0

私のデータベースは非常に大きく、私はX項目を引き出すために借りているとしましょう'.OrderBy(p => p.Title).Take(100).ToList();'、100個のアイテムを取る前に、テーブル全体をプルダウンしませんか? – jullin

+1

@jullinいいえ、これは最初の100タイトルだけです。テーブル全体をプルするには、 'model.OrderBy(p => p.Title).ToList();'を実行します。 –

+0

@C。ロス、私の更新を参照してください:どのように私はページングに対処できますか? (私は最初に並べ替える必要がありますし、ページのみ)linqを使用しています。 – jullin

1

私は遅延ロード技術を使用することをお勧めします。この場合、あなたがそれらを必要とするまで、オブジェクトのあなたのツリー内のすべてのものをロードする必要はありません。

class item 
{ 
int id; 
string itemName; 
item partent; 
List<item> _childs; 
public List<item> Childs 
{ 
    get 
{ 
    if(_child == null) 
    _child = getitembyparentid(this.id); 
    return _child; 
} 
} 
} 

そのような何かをし、この場合、あなたドンでそれらを処理するためにすべての行をメモリに持っていなければなりません。

+0

私はすべての子供がいるすべてのアイテムを取得するように頼んだ – jullin

関連する問題