2011-01-06 14 views
4

Ich möchte die Daten abrufen und in sortierten anzeigen (Kind unterhalb der übergeordneten).
Die Daten definiert wie folgt: ID | Titel | Eltern-IDWie können hierarchische Daten mit Linq-to-Entities abgerufen werden?

Was ich mache, ist zuerst alle Artikel abzurufen und dann zu sortieren.
Gibt es eine bessere Möglichkeit, das mit Linq zu tun?

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); 
      } 
     } 
    } 

Update:

Wie sein, wenn die Größe der Daten sehr groß ist, und ich will Paging benutzen?
Ich kann nicht Seite (.Skip(PageSize * PageIndex).Take(PageSize)) vor dem Sortieren ...

+0

Mögliche Duplikat von http://StackOverflow.com/Questions/202912/Hierarchical-Data-in-Linkl-Options-and-Performance – too

Antwort

0

Ich fürchte, Sie müssen über die LINQ Ergebnisse in Ihrem Code recurse. Abhängig von der Tabellengröße und -struktur möchten Sie vielleicht die gesamte Tabelle in den Speicher ziehen (so wie es aussieht) und die Hierarchie dorthin laufen lassen. Wenn Sie eine sehr große Tabelle haben, möchten Sie möglicherweise wiederholte Fahrten zur Datenbank machen.

Für weitere Informationen lesen Sie diesen großen Artikel: Storing Hierarchical Data in a Database

Ihr Code bereits die Abflachung im Speicher zu tun. Ich würde vorschlagen, Skip(pSize * pIndex).Take(pSize) auf Ihrem list2-Objekt zu verwenden (das die abgeflachten Daten enthält). Beachten Sie, dass dies zu Seitenumbrüchen in der Hierarchie führen kann.

+0

Lassen Sie uns sagen, meine Datenbank ist sehr groß und ich verspotte es, X-Elemente zu ziehen, und das tue ich '.OrderBy (p => p.Title) .Nehmen Sie (100) .ToList();' auf, bevor Sie 100 Einträge nehmen, zieht das nicht die ganze Tabelle nach unten? – jullin

+1

@jullin Nein, das dauert nur die ersten 100 Titel. Um die ganze Tabelle zu ziehen, würden Sie 'model.OrderBy (p => p.Title) .ToList();'. –

+0

@C. Ross, bitte beziehen Sie sich auf mein Update: Wie kann ich mit Paging umgehen? (Ich muss zuerst sortieren und nur dann Seite) mit linq. – jullin

1

Ich ermutige Sie, verzögertes Laden Techniken zu verwenden, und dieser Fall Sie müssen nicht alles, was in Ihrem Baum von Objekt laden, bis Sie sie benötigen:

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; 
} 
} 
} 

so ähnlich, und in diesem Fall, dass Sie don Sie müssen nicht alle Zeilen in den Speicher bringen, um sie zu verarbeiten.

+0

Ich fragte alle Gegenstände mit allen Kindern zu bekommen – jullin

Verwandte Themen