Lassen Sie mich meine einfache Lösung anbieten, die den Anforderungen entspricht, um den Zweig hierarchischer Daten der Organisationsstruktur der ausgewählten Abteilung zu aktivieren / deaktivieren.
Die Tabelle Abteilungen sieht nach dieser SQL aus
CREATE TABLE [dbo].[Departments](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](1000) NOT NULL,
[OrganizationID] [int] NOT NULL,
[ParentID] [int] NULL,
[IsEnabled] [bit] NOT NULL,
CONSTRAINT [PK_Departments] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
C # -Code bietet einen sehr einfachen Ansatz, der für mich gut funktioniert. 1. Es gibt die vollständige Tabelle asynchron zurück. 2. Es ändert die Eigenschaft für die verknüpften Zeilen.
public async Task<bool> RemoveDepartmentAsync(int orgID, int depID)
{
try
{
using (var db = new GJobEntities())
{
var org = await db.Organizations.FirstOrDefaultAsync(x => x.ID == orgID);
if (org != null)
{
var allDepartments = await db.Departments.ToListAsync();
var isExisting = allDepartments.FirstOrDefault(x => x.OrganizationID == orgID && x.ID == depID);
if (isExisting != null)
{
isExisting.IsEnabled = false;
var all = allDepartments.Where(x => x.OrganizationID == orgID && x.ID == isExisting.ID).ToList();
foreach (var item in all)
{
item.IsEnabled = false;
RecursiveRemoveDepartment(orgID, item.ID, ref allDepartments);
}
await db.SaveChangesAsync();
}
return true;
}
}
}
catch (Exception ex)
{
logger.Error(ex);
}
return false;
}
private void RecursiveRemoveDepartment(int orgID, int? parentID, ref List<Department> items)
{
var all = items.Where(x => x.OrganizationID == orgID && x.ParentID == parentID);
foreach (var item in all)
{
item.IsEnabled = false;
RecursiveRemoveDepartment(orgID, item.ID, ref items);
}
}
Dieser Ansatz funktioniert sehr schnell für relativ kleine Datensätze, ich schätze weniger als 100000. Wahrscheinlich müssen Sie für große Datenmengen serverseitig gespeicherte Funktionen implementieren.
Genießen!