Unterstützung für datenbankübergreifende Relationen

Das Konzept des .NET Datenproviders erlaubt es, fast jede Datenquelle anzubinden. Im Grunde ahmt es ein relationales Datenbankverwaltungssystem nach, das Tabellen, Relationen, Sortierungen usw. enthält. Oft müssen Sie aber Daten aus verschiedenen Quellen kombinieren, z. B. eine Server Logdatei mit Kundenlogins und eine SQL Kundendatenbank, die alle relevanten Informationen über die Kunden enthält.

Vor LL23 gab es keine einfache Möglichkeit, solche Daten relational zu verknüpfen, da Beziehungen nur innerhalb derselben Datenquelle definiert werden konnten, also nicht über mehrere verschiedene Datenquellen hinweg. Mit der kommenden Version 23 werden wir das ändern und endlich providerübergreifende Relationen unterstützen.

Diese Funktion wird intern ermöglicht, indem Filter auf die Kindtabelle aufgesetzt werden. Wir haben das Filtern auf Datenbankebene in Version 20 eingeführt, was diesen Prozess extrem schnell macht. Die Kindtabelle einer providerübergreifenden Relation muss lediglich die ApplyFilter-Methode der ITable Schnittstelle unterstützen. Dies wird z. B. automatisch für alle SQL-Datenquellen, DataSets, Objects (via LINQ), OData und andere unterstützt. Wenn Sie Ihren eigenen Provider, der ApplyFilter unterstützt, geschrieben haben, können Sie das Feature sofort nutzen.

Eine solche übergreifende Relation einzurichten ist einfach:

// Prepare data providers
CsvDataProvider csvFile = new CsvDataProvider("ServerLog.log", true, "InetData", ';');
SqlConnectionDataProvider sqlServer = new SqlConnectionDataProvider(new SqlConnection("Server=SampleServer;Database=CRMDatabase"));

// Combine both data providers in a DataProviderCollection to be able to add relations between them
DataProviderCollection combinedDatasource = new DataProviderCollection { csvFile, sqlServer };

// Use a table from SQL Server as child table for rows from a CSV files (InetData -> Customers)
combinedDatasource.AddCrossProviderRelation("InetData2Customers",
/* Parent: */ csvFile,   "InetData", "CustomerID",
/* Child:  */ sqlServer, "Customers",   "CustomerID");

using (var LL = new ListLabel())
{
LL.DataSource = combinedDatasource;
LL.Design();
}

Im Designer wird diese Relation wie eine „normale“ Relation behandelt und in Berichtscontainern, Diagrammen, Drilldown etc. unterstützt. Solange die übergeordnete Tabelle ApplyFilter() unterstützt, können Sie auch innerhalb der untergeordneten Tabelle auf die 1:1 Daten der Elterntabelle zugreifen.

Das macht die Datenanbindung deutlich vielseitiger und benötigt nicht mehr den (nicht so gut skalierenden) Workaround einer In-Memory Datenbank wie hier skizziert – es funktioniert einfach direkt out-of-the-box :).

Empfohlene Artikel

Schreibe einen Kommentar