Linq2SQL

Nachdem ich mich ein wenig mit O/R-Mappern beschäftigt hatte und mir auch NHibernate angeschaut hatte, brachte mich Lucas auf die Idee mal Linq anzuschauen (vielen dank an dieser Stelle dafür 🙂 ).

Daraus folgt jetzt dieser Eintrag mit Mini-Howto und Beispielen.
Viel spaß damit 🙂

Mini-Howto Linq2SQL

Vorwort: Hier ein kleines mini-Howto, wie man mit LINQ auf einen MSSQL Server zugreift.
Der SQL-Server ist hier „DB01\SQLEXPRESS“ mit benutzer und passwort „test“ – Als Datenbank wird die Northwind-DB benutzt.

1. Datenbank bzw Tabellen-Klassen erstellen
Mit SQLMetal Klassen aus der Datenbank erstellen, hierfür eignet sich folgende sqlmetal.bat Datei:

1
2
3
4
5
6
7
8
9
"C:\Programme\Microsoft SDKs\Windows\v7.0A\bin\SqlMetal.exe" /Server:db01\SQLEXPRESS /user:test /password:test /database:Northwind /code:Northwind.cs 
"C:\Programme\Microsoft SDKs\Windows\v7.0A\bin\SqlMetal.exe" /Server:db01\SQLEXPRESS /user:test /password:test /database:Northwind /dbml:Northwind.dbml
 
rem ########################################################
rem # Beschreibung von SQLMetal.exe auf http://msdn.microsoft.com/de-de/library/bb386987.aspx
rem # /views    : Extrahiert Datenbankansichten.
rem # /functions : Extrahiert Datenbankfunktionen.
rem # /sprocs    : Extrahiert gespeicherte Prozeduren.
pause

2. Erstellte Klassen in VS einbinden
Nach dem ausführen liegen in dem verzeichnis wo die bat ausgeführt wurde eine *.cs und eine *.dbml Datei drin.
Die dbml-Datei wird dem VS-Projekt einfach hinzugefügt, die *.cs Datei wird automatisch mit hinzugefügt.

3. Datenbank-Verbindung aufbauen
Die Datenbank-Klasse befindet sich nun in der Klasse „Northwind“, welche sich in der standard-Einstellung in keinem Namespace befindet.
Von dieser Kalsse instanziieren wir ein Objekt und übergeben diesem den Connectionstring zur Datenbank.

1
Northwind DB = new Northwind(@"Data Source=db01\SQLEXPRESS;user=test;password=test;Initial Catalog=Northwind");

In dem Objekt „DB“ sind nun alle Daten-Zugriffmethoden für unsere Datenbank enthalten.

4. Eine Datenbank-Abfrage erstellen
Bei Linq2SQL werden SQL-Abfragen nicht als String übergeben, sondern direkt in den Quelltext geschreiben.
Möchten wir nun die tabelle „Customers“ der Northwind-Datenbank ausgelesen haben, geht das mit folgender Abfrage:

1
2
var tab_inhalt = from tCustomers in DB.Customers 
                 select tCustomers;

In tab_inhalt ist nun die Ergebnismenge, welche der SQL-Server gemäß der Abfrage zurück geliefert hat.
Diese kann dann wie folgt z.b. in eine Liste von Customer-Objekten gecastat werden:

1
List<Customers> Kunden = tab_inhalt.ToList<Customers>();

Oder z.B. in einem DataGridView angezeigt werden:

1
datagridview1.DataSource = tab_inhalt.ToList<Customers>();

Linq2SQL – Beispiele

1. Eine Zeile aus einer Tabelle mit WHERE bedingung (CustomerID=ALFKI) holen:

1
2
3
var tab_inhalt = from tCustomers in DB.Customers
                  where tCustomers.CustomerID=="ALFKI"
                 select tCustomers;

2. Alle Zeilen aus einer Tabelle holen, welche im ContactTitle mit „O“ anfangen (SQL: „LIKE ‚O%'“):

1
2
3
var tab_inhalt = from tCustomers in DB.Customers
                  where tCustomers.ContactTitle.StartsWith("O")
                 select tCustomers;

3. Alle Zeilen aus einer Tabelle holen, welche im ContactTitle irgendwo ein „e“ beinhalten (SQL: „LIKE‘ %e%'“):

1
2
3
var tab_inhalt = from tCustomers in DB.Customers
                  where tCustomers.ContactTitle.Contains("e")
                 select tCustomers;

4. Nur bestimmte Felder aus der Tabelle in der Ergebnismenge stellen:

1
2
3
4
5
6
7
var tab_inhalt = from tCustomers in DB.Customers
                 select select new
                 {
                    Firma = tCustomers.CompanyName,
                    Name = tCustomers.ContactName
                 };
dataGridView1.DataSource = tab_inhalt.ToList(); // Inhalt in eine untypisierte Liste wandeln

5. Den Datensatz aus Beispiel 1 ändern:

1
2
3
4
5
6
var tab_inhalt = from tCustomers in DB.Customers
                  where tCustomers.CustomerID == "ALFKI"
                 select tCustomers;
 
tab_inhalt.First<Customers>().ContactTitle="Geändert!"; // hier wird der wert der Eigenschaft geändert...
DB.SubmitChanges(); // ...und hier mit wieder zurück in die Datenbank geschrieben :-)

6. Einen neuen Datensatz in eine Tabelle hinzufügen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Einen neuen Kunden aus der Customers Tabelle erstellen und mit Werten füllen
Customers NeuKunde   = new Customers();
NeuKunde.CustomerID  = "FBFSS";
NeuKunde.CompanyName = "Frickel Software GmbH";
NeuKunde.ContactName = "Sven Schmalle";
NeuKunde.Address     = "Frickelstraße 66";
NeuKunde.PostalCode  = "12345";
NeuKunde.City        = "Frickeldorf";
NeuKunde.Country     = "Deutschland";
NeuKunde.Phone       = "0123/876543";
 
// Der Tabelle sagen, dass sie diesen Kunden beim SubmitCahnges einfügen soll
DB.GetTable<Customers>().InsertOnSubmit(NeuKunde);
 
// Änderungen wegspeichern
DB.SubmitChanges();

7. Einen Datensatz löschen:

1
2
3
4
5
6
7
8
9
10
// Kunde mit dem Primärschlüssel "FBFSS" suchen
var tab_inhalt = from tCustomers in DB.Customers
                  where tCustomers.CustomerID == "FBFSS"
                 select tCustomers;
 
// Der Tabelle sagen, das sie den ersten gefunden Datensatz beim SubmitChanges löschen soll
DB.GetTable<Customers>().DeleteOnSubmit(tab_inhalt.First());
 
// Änderungen weg speichern
DB.SubmitChanges();

leave your comment


*

Unterstütze den Frickelblog!