Aufbruch zu neuen Ufern: C# 3.0

Wenig flexible OR-Mapper

Aus diesem Grund wurden zahlreiche Objekt-Relationale (OR)-Mapper entwickelt, um die objektorientierte Programmiererwelt und die relationale Datenbankwelt zusammenzubringen. OR-Mapper sind leistungsfähige und meist umfangreiche Werkzeuge. Sie erlauben dem Programmierer, die Objekte seines Programms direkt in eine Datenbank zu schreiben oder aus ihr auszulesen. Dabei muss er theoretisch weder explizit Datenbanktabellen anlegen noch SQL-Code schreiben. In der Praxis haben diese OR-Mapper aber vor allem dann Probleme, wenn es um Performance und Flexibilität geht.

C# 3.0 geht nun einen ganz anderen und neuen Weg und integriert SQL in den Sprachumfang. Typische Sprachelemente aus SQL wie Select, Where oder OrderBy werden in C# zu Schlüsselwörtern. Ein Syntaxcheck kann schon beim Schreiben oder Kompilieren viele Fehler abfangen. Zudem vereinfachen sich datenbankabhängige Programme drastisch, wie folgendes Beispiel zeigt:

using System;
using System.Query;
using System.Collections.Generic;

class Test
{
static void Main
{
string[] cities = {"Amsterdam", "Brüssel", "Bonn", "Berlin", "Helsinki", "Oslo", "Moskau", "Kiew", "Warschau", "Prag", "Budapest", "Wien" };

IEnumerable<string> shortCities = from city in cities where city.Length < 5 orderby city select city.ToUpper();
foreach (string city in shortCities)
Console.WriteLine(city);
}
}

Die Ausgabe dieses Programms würde lauten:

BONN
KIEW
OSLO
PRAG
WIEN

Schon bei diesem einfachen Beispiel werden drei Punkte deutlich:

  • Es lassen sich auch ganz normale C#-Datenstrukturen – in diesem Fall ein String Array – über SQL-Kommandos abfragen.

  • In der SQL-Abfrage werden die normalen Datentypen von C# wie etwa Strings verwendet. Der Programmierer kann daher auch auf die Methoden und Properties dieser Typen zugreifen. Dies geschieht im Beispiel im where-Statement durch das Length Property und die ToUpper()-Methode.

  • Der Rückgabewert einer query-Anweisung ist ein Iterator (IEnumerable) und nicht eine unflexiblere Collection.