Frage

Wie kann ich bei einem Arbeitnehmer eine LINQ zu SQL -Abfrage erstellen, um alle Vorfahren des Mitarbeiter zu finden? Jedes Mitarbeiter verfügt über einen zugehörigen Supervisorid (siehe unten).

Zum Beispiel sollte eine Anfrage der Vorfahren für Mitarbeiter 6 (Frank Black) Jane Doe, Bob Smith, Joe Bloggs und Head Honcho zurückgeben.

Bei Bedarf kann ich die Liste aller Mitarbeiter zwischenspeichern, um die Leistung zu verbessern.

AKTUALISIEREN:

Ich habe die folgende grobe Methode erstellt, um die Aufgabe zu erfüllen. Es durchquert die Mitarbeiterbeziehung von Mitarbeitern. Dies wird jedoch einen Datenbankanruf für jeden Mitarbeiter ausstellen. Hat jemand eine prägnantere oder leistungsfähigere Methode? Vielen Dank.

private List<Employee> GetAncestors(int EmployeeId)
{
    List<Employee> emps = new List<Employee>();
    using (L2STestDataContext dc = new L2STestDataContext())
    {
        Employee emp = dc.Employees.FirstOrDefault(p => p.EmployeeId == EmployeeId);
        if (emp != null)
        {
            while (emp.Supervisor != null)
            {
                emps.Add(emp.Supervisor);
                emp = emp.Supervisor;
            }
        }
    }
    return emps;
}
War es hilfreich?

Lösung

Zunächst einmal können Sie die hierarchischen Abfragen in meinem verwenden LINQ -Erweiterungsmethoden Projekt. Ich denke, kann dazu beitragen, Ihren Code zu vereinfachen.

Das Problem hierfür ist, dass dies für jeden Knoten in der Hierarchie einen Datenbankaufruf erstellt. Im Fall Ihres Beispiels haben Sie 5 Hin- und Rückfahrten in der Datenbank.

Ich würde einen anderen Weg gehen und ein gespeichertes Verfahren erstellen, um das für mich zu tun und den gesamten Satz von zurückzugeben Employee Objekte. Da Sie die Objekte trennen, bevor Sie sie zurückgeben (Entsorgung des Kontextes), können Sie einfach ein neues Objekt aus der Ergebniseinstellung des gespeicherten Prozesses erstellen.

Andere Tipps

Eine einfache Lösung, die vermeidet, die gesamte Mitarbeitertabelle zu beladen (aber eine begrenzte Durchfahrtiefe aufweist), ist ...

var emps = dc.Employees.Where(e => (e.EmployeeId == EmployeeId) ||
                                   (e.SupervisorId == EmployeeId) ||
                                   (e.Supervisor.SupervisorId == EmployeeId) ||
                                   (e.Supervisor.Supervisor.SupervisorId == EmployeeId) ||
                                   ...);

Letztendlich sollten Sie a verwenden Common Table Expression Um die Hierarchie zu verflachen, aber Linq an SQL unterstützt dies derzeit nicht. Sie können sich befassen, Ihre eigene Erweiterungsmethode zu schreiben (wie die in Omer-Bibliothek, aber mit iQueryable anstelle von iEnumerable, um die serverseitige Ausführung zu unterstützen).

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