Frage

Ich habe eine Linq-to-SQL-Datenschicht mit 2 Tabellen. "Elternteil" und "Kind". Es gibt eine Beziehung zwischen Kind und Eltern (also hat Eltern viele Kinder usw. usw.), ein Elternteil kann auch viele Eltern haben (wenn Kinder erwachsen werden und sich selbst Eltern werden).

Ich möchte diese Hierarchie dem Benutzer anzeigen, aber ich bin mir nicht sicher, wie ich dies effizient machen soll.

Der ineffiziente Ansatz ist zu tun:

foreach(Parent in db.Parents)
{
    output(Parent.Parents)
    output(Parent.Children)
}

Aber dies erzeugt eine DB -Rundreise für jede Iteration in der Schleife (Eek !!), wenn es eine große Familie ist, wird dies sehr teuer.

Gibt es einen besseren Weg? (Gott, ich hoffe es!)

War es hilfreich?

Lösung

Ich würde vorschlagen, die gesamte Sammlung zu laden, die Sie an die Benutzeroberfläche übergeben möchten. Wenn die Methode zur Generierung der übergeordneten -> übergeordneten Sammlung rekursiv ist (was es scheint), verwenden Sie den L2S -Code, um die Elemente rekursiv auszuwählen. Auf diese Weise wird die Iterie der endgültigen Erfassung von Ergebnissen in der Benutzeroberfläche die SQL -Befehle nicht in ineffizienter Weise auslösen.

Beispiel:
Ich weiß nicht, ob dies die beste/kürzeste/sauberste Art ist, dies zu tun, aber hoffentlich werden Sie die Idee bekommen. static Funktionen, es ist eine Konsolen -App.

class Program
{
    static void Main(string[] args)
    {
        foreach (ParentDTO p in GetParents().ToList())
        {
            if (p.Parent == null)
                Console.WriteLine(String.Format("{0} ({1})",
                    p.Name, p.ID.ToString()));
            else
                Console.WriteLine(String.Format("{0} ({1}){2}",
                    p.Name, p.ID.ToString(), "\r\n\t-" + p.Parent.Name));
        }

        Console.ReadKey();
    }

    private static IQueryable<ParentDTO> GetParents()
    {
        var db = new DataClasses1DataContext();
        db.Log = new DebuggerWriter();

        return from p in db.Parents
               let parentParent = GetParentOfParent(p.ParentID)
               select new ParentDTO
               {
                   ID = p.ID,
                   Name = p.Name,
                   Parent = parentParent
               };
    }

    private static ParentDTO GetParentOfParent(int? childParentID)
    {
        if (childParentID.HasValue)
            return GetParents().Single(p => p.ID == childParentID);
        else
            return null;
    }
}

Tabellendaten:

ID -Parentid -Name
1 Null Bill
2 8 Mary
3 1 Gary
4 1 Milla
5 NULL SUE
6 NULL Fred
7 Null Marg
8 7 Hillary

Ausgabe:

Rechnung (1)
Mary (2)
-Hillary
Gary (3)
-Rechnung
Milla (4)
-Rechnung
Sue (5)
Fred (6)
Marg (7)
Hillary (8)
-Marg

(Die eingewiesenen/gebildeten Namen sind die jeweiligen Eltern)

Dies ist die Debuggerausgabe aus dem L2S DC Log:

Wählen Sie [t0]. [ID], [T0]. [PARTID], [T0]. [Name
Von [DBO]. [Parent] als [t0
Wo ([t0]. [Id]) = @p0
- @p0: Eingabe int (size = 0; pREC = 0; scale = 0) [8
- Kontext: SQLProvider (SQL2005) Modell: AttributedMetamodel Build: 3.5.30729.1

Wählen Sie [t0]. [ID], [T0]. [PARTID], [T0]. [Name
Von [DBO]. [Parent] als [t0
Wo ([t0]. [Id]) = @p0
- @p0: Eingabe int (size = 0; pREC = 0; scale = 0) [7
- Kontext: SQLProvider (SQL2005) Modell: AttributedMetamodel Build: 3.5.30729.1

Wählen Sie [t0]. [ID], [T0]. [PARTID], [T0]. [Name
Von [DBO]. [Parent] als [t0
Wo ([t0]. [Id]) = @p0
- @p0: Eingabe int (size = 0; pREC = 0; scale = 0) [1
- Kontext: SQLProvider (SQL2005) Modell: AttributedMetamodel Build: 3.5.30729.1

Wählen Sie [t0]. [ID], [T0]. [PARTID], [T0]. [Name
Von [DBO]. [Parent] als [t0
Wo ([t0]. [Id]) = @p0
- @p0: Eingabe int (size = 0; pREC = 0; scale = 0) [1
- Kontext: SQLProvider (SQL2005) Modell: AttributedMetamodel Build: 3.5.30729.1

Wählen Sie [t0]. [ID], [T0]. [PARTID], [T0]. [Name
Von [DBO]. [Parent] als [t0
Wo ([t0]. [Id]) = @p0
- @p0: Eingabe int (size = 0; pREC = 0; scale = 0) [7
- Kontext: SQLProvider (SQL2005) Modell: AttributedMetamodel Build: 3.5.30729.1

.. alle, die auf einen Gehen auf die abgefeuert wurden .ToList(); Linie (wie erwartet).

Ich hoffe das ist nützlich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top