Entwickler-Ecke

Datenbanken (inkl. ADO.NET) - bei Data.Linq.Table mit Variable für die Tabelle arbeiten


Habak - Di 15.02.11 18:48
Titel: bei Data.Linq.Table mit Variable für die Tabelle arbeiten
Guten Abend,

ich habe mehrere Tabellen in einem DataContext.
Nun würde ich gerne über eine Variable auf die jeweils gewünschte Tabelle zugreifen.

Ohne eine "Variabilität" lässt sich mit folgenden Zeilen die Anzahl der Datensätze aus der Tabelle "010000" ermitteln:


C#-Quelltext
1:
2:
3:
DatenDataContext Datenbank = new DatenDataContext(DBPfad);
var Daten = Datenbank.GetTable<_010000>(); //die Tabelle heisst "010000"
int Anzahl = Daten.Count();


Wie lässt sich nun die verwendete Tabelle als Variable verwenden?

Mit:


C#-Quelltext
1:
2:
3:
4:
DatenDataContext Datenbank = new DatenDataContext(DBPfad);
var test = "_010000";
var Daten = Datenbank.GetTable<test>();
int Anzahl = Daten.Count();


funktioniert es leider nicht.

Für eine Lösung wäre bedanke ich mich schon im voraus.

Gruß

Habak

Moderiert von user profile iconKha: C#-Tags hinzugefügt


Kha - Di 15.02.11 19:20

Ich wüsste nicht, dass der Tabellenname irgendwo in Linq to SQL eine Rolle spielt oder überhaupt auftaucht. Wenn du den Entity-Typ der Tabelle kennst, kannst du die Überladung von GetTable benutzen, ansonsten musst du wohl in deiner Erklärung etwas weiter ausholen.


Trashkid2000 - Di 15.02.11 19:40

Hi Habak,
habe gerade mal was ausprobiert. Du kannst über das Mapping des Contextes die MetaTable bekommen, darüber den Typ der Row und schließlich die Tabelle. Lange Rede, kurze Ausführung:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
using (DataContext ctx = new DataContext())
{
  var metaTable = ctx.Mapping.GetTables().FirstOrDefault(t => t.TableName.Equals("dbo.Patient"));
  if (metaTable != null)
  {
    var patientTable = ctx.GetTable(metaTable.RowType.Type);  
    if (patientTable != null)
    {
      //do something
    }
  }
}
Habe es hier mal als Beispiel mit 'ner Patiententabelle gemacht. An der Stelle sei gesagt, dass Du als TableName den ganzen Namen (also Schema der Tabelle + Name) angeben musst! Auch wenn ich das Vorhaben, eine Tabelle über einen String zu identifizieren, nicht so ganz toll finde. Aber wenn Du es unbedingt brauchst.
LG und schönen Abend, Marko


Habak - Mi 16.02.11 15:23

Hallo Zusammen,

warum ich den Tabellennamen benötige ist kurz erklärt.
Ich habe einen Algorithmus der eine baumförmige Struktur besitzt. D.h. an einem Knoten gibt es mehrere Unterknoten usw..
Je Knoten gibt es eine Tabelle, die die spezifischen Eigenschaften beschreibt. Aus diesen wird dann auch der komplette Form-Inhalt automatisch generiert.
U.a. auch Buttons, mit denen eine Auswahl getätigt wird.
Je nach Auswahl wird der Tabellenname ermittelt, der dann für die neue Darstellung die notwendigen Daten notwendig ist.
Da ich einen recht großen "Baum" habe, der auch einfach erweiterbar sein muss, wäre eine starre Programmierung mit Namen sehr aufwendig und unübersichtlich.

Gruß

Habak


Kha - Mi 16.02.11 15:50

Das erklärt für mich nicht, warum du über die Tabellennamen gehst und nicht auf der C#-Abstraktionsebene bleibst, indem du beispielsweise die System.Types der einzelnen Entity-Klassen benutzt (könnte vielleicht auch in Richtung Dependency Injection gehen?). Es scheinen ja nicht zur Laufzeit einfach neue Tabellen hinzuzukommen, sonst würdest du wohl überhaupt nicht auf Linq to SQL setzen.


Habak - Mi 16.02.11 16:16

Hallo Kha,

nein es werden zu Laufzeit keine neuen Tabellen erstellt.
Leider ist mir Deine Antwort eine Sphäre zu hoch.
Trotzdem Danke für den Versuch.

Gruß

Habak