| 

.NET C# Java Javascript Exception

2
Servus zusammen!
ich steh grad völlig auf dem Schlauch. Ich habe eine Baumstruktur über SortedList(Id, Objekt) abgebildet. Nach dem Lesen der Daten aus der Datenbank baue ich einen Baum dazu mittels Rekursion auf. Da der Anwender jetzt aber eien Sehr, sehr große Datenmenge hinterlegt hat, benötigt der Aufbau dieses Baums fast eine Minute (was definitiv zu lange ist).
Mein Gedanke wäre jetzt gewesen diesen Baum nicht wie bislang mittels Rekursion aufzubauen sondern iterativ. Dabei überreisse ich grad nicht wie ich durch die einzelen Äste komme...

Habt ihr hier nen Tipp für mich?

Aktuell sieht so der IST-Stand aus:
public class Lager
{
public int Id {get;set;}
public int ÜbergeordneterKnoten {get;set;}
public SortedList<int, Lager> Lagerorte{get;set}
//… weitere Eigenschafte wie Name, usw.
}

public class Servive {


private SortedList<int, Lager> _lagerorte;

private void AufbauBaumstruktur(List<Lager> listeLagerorte ) {
foreach (lager in listeLagerorte) {
if (lager.ÜbergeordneterKnoten = - 1) {
_Lagerorte.add(lager.Id, lager);
} else {
ZumLagerOrtAddieren(lager, _Lagerorte);
}
}
}
private void ZumLagerortAddieren(Lager lager, SortedList<int, Lager> listeOrte) {
if (listeOrte.ContainsKey(lager.ÜbergeordneterKnoten) {
listeOrte(lager.ÜbergeordneterKnoten).Lagerorte.Add(lager.Id, lager);
} else {
foreach (var Lagerort in listeOrte.Values) {
ZumLagerortAddieren(lager, Lagerort.Lagerorte)
}
}
}
}
16.07.2018
1 Antwort
0
Das dürfte nur gelingen, wenn in den Ausgangsdaten (Datenbank) ein Hinweis zur Baumstruktur enthalten ist.
Es gibt SQL-Dialekte, die anhand von Verknüpfungen das Ganze als Tabelle darstellen können (z.B. MS SQL-Server mit Tabellenwertfunktionen).
Sie finden dies unter den Stichworten T-SQL rekursiv. Hier ein einfaches Beispiel für das Durchsuchen einer Mitarbeiterhierarchie von T-SQL-Beispielen:
-- Create an Employee table.  
CREATE TABLE dbo.MyEmployees
(
EmployeeID smallint NOT NULL,
FirstName nvarchar(30) NOT NULL,
LastName nvarchar(40) NOT NULL,
Title nvarchar(50) NOT NULL,
DeptID smallint NOT NULL,
ManagerID int NULL,
CONSTRAINT PK_EmployeeID PRIMARY KEY CLUSTERED (EmployeeID ASC)
);
-- Populate the table with values.
INSERT INTO dbo.MyEmployees VALUES
(1, N'Ken', N'Sánchez', N'Chief Executive Officer',16,NULL)
,(273, N'Brian', N'Welcker', N'Vice President of Sales',3,1)
,(274, N'Stephen', N'Jiang', N'North American Sales Manager',3,273)
,(275, N'Michael', N'Blythe', N'Sales Representative',3,274)
,(276, N'Linda', N'Mitchell', N'Sales Representative',3,274)
,(285, N'Syed', N'Abbas', N'Pacific Sales Manager',3,273)
,(286, N'Lynn', N'Tsoflias', N'Sales Representative',3,285)
,(16, N'David',N'Bradley', N'Marketing Manager', 4, 273)
,(23, N'Mary', N'Gibson', N'Marketing Specialist', 4, 16);

WITH DirectReports(ManagerID, EmployeeID, Title, EmployeeLevel) AS
(
SELECT ManagerID, EmployeeID, Title, 0 AS EmployeeLevel
FROM dbo.MyEmployees
WHERE ManagerID IS NULL
UNION ALL
SELECT e.ManagerID, e.EmployeeID, e.Title, EmployeeLevel + 1
FROM dbo.MyEmployees AS e
INNER JOIN DirectReports AS d
ON e.ManagerID = d.EmployeeID
)
SELECT ManagerID, EmployeeID, Title, EmployeeLevel
FROM DirectReports
ORDER BY ManagerID;
GO

Das wichtigste ist die Verknüpfung der Daten über das Feld ManagerID (bei Ihnen möglicherweise LagerID) wobei die Top-Level-Elemente hier einen Eintrag NULL haben.
16.07.2018
edvservice 1,4k 1 6

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH