Ronnie Saurenmann geht zügig in seinem gebrochenen Tessinerenglisch durch die Vorteile von Linq und zeigt dessen Einfachheit und Ausbaufähigkeit. Dazu gehören das schnelle Zusammenstellen neuer Klassen im Designer, welche anschliessend wie eine View funktionieren und das Paging von Daten.

Nach eine halben Stunde fängt er an die Dinge zu zeigen, welche gefährlich sind. Das gefährlichste ist die Möglichkeit Dinge zu programmieren ohne zu verstehen, was im Hintergrund passiert. Das dürfte dann vor allem die Entwicklerneulinge betreffen, welche nie SQL pgorammiert haben sondern lediglich über Linq arbeiten :)

Eines dieser Dinge ist Lazy (faul) vs. eager (fleissig) databinding. Wann wird ein Query ausgeführt? Bei der Definition oder beim Anzeigen der Daten? Lösung: Ein Query wird erst ausgeführt, wenn er verwendet wird.

var query = from c in db.Customers where c.Orders.Count() > 5
Select c;
dataGridView1.DataSource = query1;

Diese Query wird nicht etwa bei der Select Anweisung ausgeführt sondern erst bei der Verwendung als Datasource, wenn die dataGrivView gespeichert wird.

var query = from c in db.Customers where c.Orders.Count() > 5
Select c;
var query1 from c in query where c.city == "London"
select c;
dataGridView1.DataSource = query1;

Hier könnte man eigentlich davon ausgehen, dass der Query ausgeführt wird, wenn query1 einen Select auf query macht, denn es sind Daten von Daten. Tatsächlich aber wird für query1 lediglich die SQL Anweisung erweitert, der Datenzugriff erfolgt dann wiederum bei der Verwendung als Datasource. Es werden also keine zwei Statemens auf die DB losgelassen sondern nur einer. Ziemlich klever.

var query = from c in db.Customers where c.Orders.Count() > 5
Select c;
var list = query.ToList();
var query1 from c in list where c.city == "London"
select c;
dataGridView1.DataSource = query1;

Anders dieser Fall. Durch query.ToList() greifen wir direkt auf die DB zu und lesen die Datensätze in unser Memory. Hier bleiben die Daten unverändert bestehen und sind bereit für weitere Abfragen. Die Abfrage von query1 hingegen benötigt keinen weiteren Datenbankzugriff, da die Daten vorhanden sind...

Das Ganze ist also recht intelligent programmiert und wichtig zu verstehen, denn hier lassen sich Ressourcen sparen oder verschwenden. Auch kann man von mit falschen Annahmen einige Probleme generieren. Über die DataLoadOptions() kann dann nochmals einiges Steuern, z.B. vorgeben, welche Daten mitgeladen werden sollten.

Linq ist auf alle Fälle etwas zum vertiefen.