net biblio thek

Werbung
hrsg. von dr. holger SCHWICHTENBERG
.NET BIBLIOTHEK
walter DOBERENZ
matthias FISCHER
jana FRANK
thomas GEWINNUS
jörg KRAUSE
patrick a. LORENZ
jörg NEUMANN
dr. holger SCHWICHTENBERG
.NET 3.5
WPF, WCF, LINQ, C# 2008,
VB 2008 und ASP.NET AJAX
Inhaltsverzeichnis
Geleitwort
Vorwort
...................................................................................
15
.......................................................................................
17
Danksagung
.................................................................................
Über dieses Buch
..........................................................................
19
21
Teil I: Einführung
1
Einführung in LINQ
1.1
1.2
1.3
1.4
.......................................................................
27
Was ist LINQ? ..........................................................................
1.1.1
Ein Überblick .................................................................
1.1.2
LINQ als Werkzeugsammlung ...............................................
1.1.3
LINQ als Spracherweiterung ................................................
Warum brauchen wir LINQ? ...........................................................
1.2.1
Allgemeine Probleme ........................................................
1.2.2
Zur Fehlanpassung zwischen den Paradigmen ..............................
1.2.3
LINQ als Retter in der Not ...................................................
Entwurfsziele und Ursprünge von LINQ ..............................................
1.3.1
Die Ziele des LINQ-Projekts ................................................
1.3.2
Ein historischer Rückblick ...................................................
Die ersten Schritte mit LINQ to Objects ..............................................
1.4.1
Was wir für den Start brauchen ..............................................
1.4.2
Hello LINQ to Objects .......................................................
28
28
29
30
32
33
35
40
42
42
43
45
45
47
6
Inhaltsverzeichnis
1.5
1.6
1.7
2
Erste Schritte mit LINQ to XML ......................................................
1.5.1
Warum brauchen wir LINQ to XML? .......................................
1.5.2
Hello LINQ to XML .........................................................
Erste Schritte mit LINQ to SQL .......................................................
1.6.1
Überblick über die LINQ to SQL-Features ..................................
1.6.2
Hello LINQ to SQL ..........................................................
1.6.3
Ein genauerer Blick auf LINQ to SQL ......................................
Zusammenfassung .....................................................................
Spracherweiterungen in C# und VB
2.1
2.2
2.3
2.4
2.5
2.6
2.7
51
51
53
58
58
59
63
63
.................................................
65
Die neuen Spracherweiterungen erkunden ............................................
2.1.1
Eine Liste der laufenden Prozesse generieren ...............................
2.1.2
Gruppieren der Ergebnisse in einer Klasse ..................................
Implizit typisierte lokale Variablen ....................................................
2.2.1
Die Syntax ....................................................................
2.2.2
Beispiel mit implizit typisierten lokalen Variablen ..........................
Objekt- und Collection-Initialisierer ...................................................
2.3.1
Warum wir Objektinitialisierer brauchen ....................................
2.3.2
Collection-Initialisierer ......................................................
2.3.3
Verbesserung unseres Beispiels mit Objektinitialisierer ....................
Lambda-Ausdrücke ....................................................................
2.4.1
Eine Auffrischung zu Delegates .............................................
2.4.2
Anonyme Methoden .........................................................
2.4.3
Einführung in die Lambda-Ausdrücke ......................................
Erweiterungsmethoden .................................................................
2.5.1
Beispiel für das Erzeugen einer Erweiterungsmethode .....................
2.5.2
Weitere Beispiele zu den LINQ Standard-Abfrageoperatoren ..............
2.5.3
Erweiterungsmethoden im Einsatz ..........................................
2.5.4
Einsatzbeschränkungen ......................................................
Anonyme Typen ........................................................................
2.6.1
Anonyme Typen zum Gruppieren von Daten ...............................
2.6.2
Namenlose Typen sind trotzdem Typen .....................................
2.6.3
Verbesserung unseres Beispiels durch anonyme Typen .....................
2.6.4
Einschränkungen .............................................................
Zusammenfassung .....................................................................
65
66
68
69
69
70
72
72
73
74
76
76
78
78
84
84
87
89
90
93
93
93
94
95
97
7
Inhaltsverzeichnis
3
Der LINQ-Baukasten
3.1
3.2
3.3
3.4
3.5
3.6
3.7
.....................................................................
101
Wie .NET mit LINQ erweitert wird ...................................................
3.1.1
Die grundlegenden Spracherweiterungen ...................................
3.1.2
Die Schlüsselelemente der LINQ-Foundation ...............................
Einführung von Sequenzen ............................................................
3.2.1
IEnumerable<T> .............................................................
3.2.2
Mehr über Iteratoren .........................................................
3.2.3
Verzögerte Ausführung von Abfragen .......................................
Einführung in die Abfrageoperatoren ..................................................
3.3.1
Was macht eigentlich ein Abfrageoperator? .................................
3.3.2
Die Standard-Abfrageoperatoren ............................................
Einführung in Abfrageausdrücke ......................................................
3.4.1
Was ist ein Abfrageausdruck? ................................................
3.4.2
Schreiben von Abfrageausdrücken ..........................................
3.4.3
Standard-Abfrageoperatoren versus Abfrageausdrücke .....................
3.4.4
Einschränkungen .............................................................
Einführung in die Expression Trees ...................................................
3.5.1
Die Rückkehr der Lambda-Ausdrücke ......................................
3.5.2
Was sind Expression-Trees? .................................................
3.5.3
IQueryable und verzögertes Ausführen von Abfragen ......................
LINQ-DLLs und -Namensräume ......................................................
Zusammenfassung .....................................................................
101
101
103
103
104
105
107
111
111
114
115
115
116
118
120
122
122
123
125
126
128
Teil II: LINQ to Objects
4
Arbeiten mit LINQ to Objects
4.1
4.2
4.3
..........................................................
131
Einführung in unsere Beispielanwendung .............................................
4.1.1
Unsere Ziele ..................................................................
4.1.2
Features .......................................................................
4.1.3
Die Geschäfts-Entitäten ......................................................
4.1.4
Datenbankschema ............................................................
4.1.5
Beispieldaten .................................................................
LINQ für In-Memory-Collections .....................................................
4.2.1
Was können wir abfragen? ...................................................
4.2.2
Unterstützte Operationen ....................................................
LINQ mit ASP.NET und Windows Forms ............................................
4.3.1
Datenbindung für Webanwendungen ........................................
131
132
132
133
134
134
136
137
141
142
142
8
Inhaltsverzeichnis
4.4
4.5
4.6
5
4.3.2
Datenbindung für Windows Forms-Applikationen .........................
Die wichtigsten Standard-Abfrageoperatoren .........................................
4.4.1
Der Einschränkungs-Operator Where .......................................
4.4.2
Verwendung von Projektions-Operatoren ...................................
4.4.3
Anwendung von Distinct ....................................................
4.4.4
Anwenden von Konvertierungsoperatoren ..................................
4.4.5
Verwendung von Aggregat-Operatoren ......................................
Sichten auf einen Objektgraphen im Speicher ........................................
4.5.1
Sortierung ....................................................................
4.5.2
Eingebettete Abfragen .......................................................
4.5.3
Gruppieren ...................................................................
4.5.4
Verwenden von Joins .........................................................
4.5.5
Partitionieren .................................................................
Zusammenfassung .....................................................................
Jenseits der Standardabfragen
5.1
5.2
5.3
5.4
149
154
155
156
159
160
161
162
162
164
167
168
174
179
........................................................
181
Allgemeine Szenarien ..................................................................
5.1.1
Abfrage nichtgenerischer Collections .......................................
5.1.2
Gruppieren nach Mehrfachkriterien .........................................
5.1.3
Dynamische Abfragen .......................................................
5.1.4
LINQ to Text Files ...........................................................
Entwurfsmuster ........................................................................
5.2.1
Funktionale Konstruktion – ein Pattern .....................................
5.2.2
Das ForEach-Pattern .........................................................
Betrachtungen zur Performance .......................................................
5.3.1
Streaming-Strategie ..........................................................
5.3.2
Vorsicht bei sofortiger Ausführung ..........................................
5.3.3
Verschlechtert LINQ to Objects die Performance? ..........................
5.3.4
Gedanken zum Overhead von LINQ to Objects ............................
5.3.5
Performance versus Kürze – ein Dilemma? .................................
Zusammenfassung .....................................................................
181
182
184
187
197
200
200
203
205
206
208
210
213
216
217
Teil III: LINQ to SQL
6
Der Einstieg in LINQ to SQL
6.1
............................................................
221
Start mit LINQ to SQL .................................................................
6.1.1
Zuordnung (Mapping) der Objekte ..........................................
222
225
9
Inhaltsverzeichnis
6.2
6.3
6.4
6.5
6.6
6.7
7
Details zu LINQ to SQL
7.1
7.2
7.3
7.4
8
6.1.2
Einrichten des DataContext ..................................................
Lesen von Daten mit LINQ to SQL ...................................................
Verfeinern unserer LINQ-Abfragen ...................................................
6.3.1
Filtern .........................................................................
6.3.2
Sortieren und gruppieren .....................................................
6.3.3
Aggregation ..................................................................
6.3.4
Joining ........................................................................
Arbeiten mit Objektbäumen ...........................................................
Wann werden meine Daten geladen? ..................................................
6.5.1
Träges Laden (lazy loading) .................................................
6.5.2
Sofortiges Laden von Detaildaten ...........................................
Aktualisieren der Daten ................................................................
Zusammenfassung .....................................................................
...................................................................
251
Mapping von Objekten mit relationalen Daten ........................................
7.1.1
Inline-Attribute ...............................................................
7.1.2
Mapping mit externen XML-Dateien ........................................
7.1.3
Das SqlMetal-Tool ...........................................................
7.1.4
Der LINQ to SQL-Designer .................................................
Übersetzen von Abfrageausdrücken nach SQL .......................................
7.2.1
IQueryable ....................................................................
7.2.2
Ausdrucksbäume ............................................................
Der Lebenszyklus der Entitäten ........................................................
7.3.1
Verfolgen von Änderungen ..................................................
7.3.2
Änderungen durchführen ....................................................
7.3.3
Arbeiten mit verbindungslosen Daten ......................................
Zusammenfassung .....................................................................
251
252
257
259
262
264
264
266
269
270
271
274
276
Erweiterte LINQ to SQL-Features
8.1
8.2
227
228
232
232
234
236
237
240
243
243
245
247
249
.....................................................
277
Umgang mit simultanen Änderungen .................................................
8.1.1
Pessimistische Konkurrenz ..................................................
8.1.2
Optimistische Konkurrenz ...................................................
8.1.3
Behandlung von Konkurrenz-Ausnahmen ..................................
8.1.4
Auflösen von Konflikten mittels Transaktionen .............................
Fortgeschrittene Datenbankfeatures ...................................................
8.2.1
SQL pass-through: Rückgabe von Objekten aus SQL Abfragen ...........
8.2.2
Arbeiten mit gespeicherten Prozeduren .....................................
277
278
278
281
284
286
287
288
10
Inhaltsverzeichnis
8.3
8.4
8.5
8.2.3
Benutzerdefinierte Funktionen ..............................................
Verbesserungen auf Geschäftsebene ...................................................
8.3.1
Kompilierte Abfragen ........................................................
8.3.2
Partielle Klassen für unsere Geschäftslogik .................................
8.3.3
Vorzüge partieller Methoden .................................................
8.3.4
Vererbung von Objekten ....................................................
Ein kurzer Abstecher nach LINQ to Entities ..........................................
Zusammenfassung .....................................................................
296
300
300
301
303
305
310
313
Teil IV: LINQ to XML
9
Einführung in LINQ to XML
9.1
9.2
9.3
9.4
9.5
9.6
.............................................................
317
Was ist die LINQ to XML-API? .......................................................
Wozu brauchen wir noch eine API? ...................................................
Die Entwurfsprinzipien von LINQ to XML ...........................................
9.3.1
Schlüsselkonzept: Funktionale Konstruktion ................................
9.3.2
Schlüsselkonzept: kontext-freie XML-Erzeugung ..........................
9.3.3
Schlüsselkonzept: Vereinfachte Namen .....................................
Die LINQ to XML-Klassenhierarchie .................................................
XML mit LINQ verarbeiten ...........................................................
9.5.1
XML laden ...................................................................
9.5.2
XML parsen ..................................................................
9.5.3
XML erzeugen ...............................................................
9.5.4
XML mit den Visual Basic XML-Literalen erzeugen .......................
9.5.5
XML-Dokumente erstellen ..................................................
9.5.6
Content in XML einfügen ....................................................
9.5.7
Content aus XML-Dokumenten löschen ....................................
9.5.8
Inhalte ändern ................................................................
9.5.9
Die Verwendung von Attributen .............................................
9.5.10 XML speichern ...............................................................
Zusammenfassung .....................................................................
317
318
319
321
322
322
325
327
328
330
331
335
337
340
342
343
345
346
346
10 XML abfragen und transformieren
10.1
...................................................
349
Die LINQ to XML-Achsen-Methoden ................................................
10.1.1 Element .......................................................................
10.1.2 Attribute ......................................................................
10.1.3 Elements ......................................................................
350
352
352
354
11
Inhaltsverzeichnis
10.2
10.3
10.4
10.5
10.1.4 Descendants (Nachkommen) ................................................
10.1.5 Ancestors (Vorfahren) ........................................................
10.1.6 Weitere Achsenmethoden ....................................................
10.1.7 Visual Basic XML-Achseneigenschaften ...................................
Die Standard-Abfrageoperatoren ......................................................
10.2.1 Projektionen mit Select ......................................................
10.2.2 Filtern mit Where ............................................................
10.2.3 Sortieren und Gruppieren ....................................................
LINQ to XML-Objekte mit XPath abfragen ..........................................
XML transformieren ...................................................................
10.4.1 Transformieren mit LINQ to XML ..........................................
10.4.2 LINQ to XML-Objekte mit XSLT transformieren ..........................
Zusammenfassung .....................................................................
11 Diverse LINQ to XML-Szenarien
11.1
11.2
11.3
11.4
11.5
11.6
11.7
355
357
359
360
363
365
366
368
371
373
373
376
378
.......................................................
379
Objekte aus XML-Daten erzeugen ....................................................
11.1.1 Aufgabenstellung .............................................................
11.1.2 Implementierung .............................................................
XML aus Objektbäumen erzeugen ....................................................
11.2.1 Aufgabenstellung .............................................................
11.2.2 Implementierung .............................................................
XML aus Datenbankinformationen erzeugen .........................................
11.3.1 Aufgabenstellung .............................................................
11.3.2 Implementierung .............................................................
Filtern/Mischen von relationalen und XML-Daten ...................................
11.4.1 Aufgabenstellung .............................................................
11.4.2 Implementierung .............................................................
XML-Daten in relationale Daten umwandeln .........................................
11.5.1 Aufgabenstellung .............................................................
11.5.2 Implementierung .............................................................
Textdateien nach XML transformieren ................................................
11.6.1 Aufgabenstellung .............................................................
11.6.2 Implementierung .............................................................
Zusammenfassung .....................................................................
379
380
382
385
385
386
391
391
393
397
398
398
402
403
404
417
417
418
420
12
Inhaltsverzeichnis
Teil V: Diverse LINQ-Techniken
12 LINQ erweitern
12.1
12.2
12.3
12.4
12.5
12.6
.............................................................................
425
Die Erweiterungsmechnismen von LINQ .............................................
12.1.1 LINQ-Flavours als LINQ-Implementierungen ..............................
12.1.2 Vorschläge für kundenspezifische LINQ-Erweiterungen ...................
Erstellen benutzerdefinierter Abfrageoperatoren ......................................
12.2.1 Verbesserungen der Standard-Abfrageoperatoren ...........................
12.2.2 Hilfs- oder bereichsspezifische Abfrageoperatoren .........................
Neuimplementierungen der Basis-Abfrageausdrücke .................................
12.3.1 Wiederholung: Der Übersetzungsmechanismus für Abfragen ..............
12.3.2 Spezifizierung des Musters für Abfrageausdrücke ..........................
12.3.3 Beispiel 1: Verfolgen der Ausführung von Standard-Abfrageoperatoren ...
12.3.4 Einschränkung: Kollision von Abfrageausdrücken .........................
12.3.5 Beispiel 2: Nichtgenerische, domänenspezifische Operatoren ..............
12.3.6 Beispiel 3: Non-Sequence Operator ........................................
Abfragen eines Webdienstes: LINQ to Amazon ......................................
12.4.1 Einführung in LINQ to Amazon .............................................
12.4.2 Anforderungen ...............................................................
12.4.3 Implementierung .............................................................
IQueryable und IQueryProvider: LINQ to Amazon erweiterte Version ..............
12.5.1 Die IQueryable- und IQueryProvider- Schnittstellen .......................
12.5.2 Implementierung .............................................................
12.5.3 Was genau passiert ...........................................................
Zusammenfassung .....................................................................
426
426
428
429
429
432
436
437
438
440
442
443
445
447
447
449
450
458
458
462
463
464
13 LINQ auf allen Ebenen
13.1
13.2
13.3
...................................................................
465
Überblick über die LinqBooks-Applikation ...........................................
13.1.1 Features .......................................................................
13.1.2 Überblick über die Benutzerschnittstelle ....................................
13.1.3 Das Datenmodell .............................................................
LINQ to SQL und die Datenzugriffsschicht ...........................................
13.2.1 Auffrischungskurs zur traditionellen 3-Schichten-Architektur .............
13.2.2 Brauchen wir eine extra Datenzugriffsschicht oder genügt LINQ to SQL?
13.2.3 Beispielanwendungen von LINQ to SQL in LinqBooks ....................
Einsatz von LINQ to XML ............................................................
13.3.1 Datenimport von Amazon ....................................................
13.3.2 Generieren von RSS-Feeds ..................................................
465
465
466
468
469
469
471
476
483
483
485
13
Inhaltsverzeichnis
13.4
13.5
13.6
13.7
13.8
Einsatz von LINQ to DataSet ..........................................................
Einsatz von LINQ to Objects ..........................................................
Erweiterbarkeit .........................................................................
13.6.1 Benutzerspezifische Abfrageoperatoren .....................................
13.6.2 Erzeugen und Verwenden benutzerspezifischer LINQ-Provider ...........
Ein Blick in die Zukunft ...............................................................
13.7.1 Kundenspezifische LINQ-Flavours ..........................................
13.7.2 LINQ to XSD – das typisierte LINQ to XML ...............................
13.7.3 PLINQ: LINQ und Parallel Computing .....................................
13.7.4 LINQ to Entities – LINQ für das ADO.NET Entity Framework ...........
Zusammenfassung .....................................................................
14 Arbeiten mit LINQ to DataSet
14.1
14.2
14.3
14.4
14.5
14.6
14.7
14.8
486
489
490
490
491
491
492
493
494
494
495
..........................................................
497
Übersicht zu LINQ to DataSet .........................................................
Kleiner Auffrischungskurs zu DataSets ...............................................
14.2.1 Anwendungsfälle und Features ..............................................
14.2.2 Was sind DataSets? ..........................................................
14.2.3 Änderungen in .NET 3.5 für LINQ to DataSet ..............................
Abfrage untypisierter DataSets ........................................................
14.3.1 Daten in DataSets laden ......................................................
14.3.2 Abfragen von DataSets ohne LINQ .........................................
14.3.3 Abfragen untypisierter DataSets mit LINQ to DataSet .....................
Abfrage typisierter DataSets ...........................................................
14.4.1 Ein typisiertes DataSet erzeugen ............................................
14.4.2 Daten in ein typisiertes DataSet laden .......................................
14.4.3 Abfragen typisierter DataSets mit LINQ to DataSet ........................
Binden der Abfrageergebnisse an die Steuerelemente ................................
14.5.1 Verwendung von CopyToDataTable .........................................
14.5.2 Zwei-Wege-Datenbindung mit AsDataView ................................
Verwendung der Abfrageoperatoren ...................................................
14.6.1 Field<T>- und SetField<T>-Operatoren für DataRows ....................
Set-Operatoren und DataRow-Vergleich ..............................................
Zusammenfassung .....................................................................
497
498
498
499
503
503
504
508
509
514
515
518
520
523
523
526
528
528
529
531
14
Inhaltsverzeichnis
Anhang
A Die Standard-Abfrageoperatoren
.....................................................
535
..................................................................
539
..........................................................................................
543
B Weitere Informationen
Index
1
Einführung in LINQ
Kapitel
1
Einführung in LINQ
Software ist eigentlich eine simple Sache, sie lässt sich auf zwei Dinge reduzieren: Code und
Daten. Das Entwickeln von Software ist allerdings nicht mehr ganz so einfach, hauptsächlich muss
man dabei Code schreiben, der sich mit Daten beschäftigt.
Für das Schreiben von Code können wir zwischen einer Vielzahl von Programmiersprachen
wählen. Welche Sprache wir nehmen, hängt von der Aufgabenstellung, unseren Vorlieben, von den
Fähigkeiten des Entwickler-Teams, vom Betriebssystem oder von Firmenrichtlinien ab.
Egal für welche Sprache Sie sich letztendlich entscheiden, ab einem bestimmten Punkt müssen Sie
damit auf Daten zugreifen. Diese Daten können in Dateien, Datenbanktabellen oder XML-Dokumenten enthalten sein, oder sie können aus dem Web stammen. Häufig handelt es sich aber um eine
Kombination dieser verschiedenen Datenquellen. Das Verwalten von Daten ist eine ultimative
Anforderung eines jeden Software-Projekts, mit dem Sie es zu tun haben.
Da das Verwalten von Daten zu den allgemeinen Aufgaben eines jeden Software-Entwicklers
gehört, erwarten wir von entsprechenden Entwicklungsplattformen, wie dem .NET Framework,
dass sie uns bei der Lösung dieser Aufgabe behilflich sind. In .NET wurde mittlerweile eine tiefere
Integration von Sprache und Daten erreicht. Wir meinen damit LINQ to Objects, LINQ to XML
und LINQ to SQL.
Die Technologien, die wir Ihnen in diesem Buch präsentieren, offerieren einen neuen Weg zum
Schreiben von Code. Da dieses Buch von Programmierern für Programmierer geschrieben wurde,
können Sie unbesorgt sein: Sie werden nicht lange auf Ihre ersten Zeilen LINQ-Code warten müssen! In diesem Kapitel werden wir schnell die obligatorischen "Hello World"-Codefragmente hinter
uns lassen und Sie darauf einstimmen, was Sie im Rest des Buchs erwartet. Unser Ziel ist es, dass
Sie es am Ende des Buchs kaum erwarten können, reale Projekte in Angriff zu nehmen, weil Sie
davon überzeugt sind, dass das Arbeiten mit LINQ Spaß macht.
Absicht dieses ersten Kapitels ist es, Ihnen eine Übersicht zu vermitteln und Ihnen zu zeigen, unter
welchen Bedingungen Sie LINQ einsetzen können. Wir beginnen mit einem Überblick über LINQ
und die verschiedenen LINQ-Werkzeuge, welche LINQ to Objects, LINQ to XML und LINQ to
SQL umfassen. Dann vermitteln wir Ihnen einige Hintergrundinformationen, damit Sie verstehen,
warum wir LINQ brauchen und woher es kommt. In der zweiten Hälfte dieses Kapitels werden wir
Sie bei Ihren ersten Schritten beim Schreiben von LINQ-Code begleiten.
28
1 Einführung in LINQ
1.1 Was ist LINQ?
Nehmen wir mal an, Sie schreiben gerade eine .NET-Anwendung. Die Wahrscheinlichkeit ist hoch,
dass Sie an einer bestimmten Stelle Objekte in einer Datenbank abspeichern, die Datenbank abfragen und die Ergebnisse zurück in die Objekte laden müssen. Das Problem ist, dass sich in den
meisten Fällen – zumindest bei relationalen Datenbanken – eine tiefe Kluft zwischen Ihrer Programmiersprache und der Datenbank auftut. Es wurden viele gut gemeinte Versuche mit objektorientierte Datenbanken unternommen, da diese näher an objektorientierten Plattformen und an
Programmiersprachen wie C# und VB.NET angesiedelt sind. Trotzdem, auch heute sind relationale
Datenbanken immer noch dominierend, und Sie haben in Ihren Programmen nach wie vor mit den
Problemen der Inkonsistenz beim objektorientierten Datenzugriff und bei der Datenpersistenz zu
kämpfen.
Die ursprüngliche Motivation für LINQ zielte auf die konzeptionellen und technischen Schwierigkeiten, wie sie beim Datenbankzugriff mit .NET-Programmiersprachen auftreten. Mit LINQ wollte
Microsoft das Problem des objektrelationalen Mappings lösen und die Interaktion zwischen Objekten und Datenquellen vereinfachen. LINQ entwickelte sich zu einer allgemein verwendbaren,
direkt in die Sprache integrierten Sammlung von Abfragewerkzeugen. Diese Werkzeugsammlung
kann benutzt werden um auf Daten zuzugreifen, die von Objekten aus dem Arbeitsspeicher (LINQ
to Objects), aus Datenbanken (LINQ to SQL), aus XML Dokumenten (LINQ to XML), aus dem
Dateisystem oder aus irgendeiner anderen Quelle kommen.
Zunächst geben wir Ihnen einen Überblick über die LINQ-Philosophie, danach betrachten wir die
Werkzeuge, die uns LINQ zur Verfügung stellt. Außerdem lernen Sie das Prinzip kennen, wie
LINQ vorhandene Programmiersprachen erweitert.
1.1.1 Ein Überblick
LINQ soll die bislang vermisste Verbindung zwischen der Welt der Daten und der Welt der Programmiersprachen herstellen. LINQ vereinheitlicht den Datenzugriff – egal um welche Datenquelle es sich handelt – und erlaubt das Mixen von Daten aus unterschiedlichen Quellen. Es
ermöglicht Abfrage- und Aktualisierungsoperationen, die den SQL-Anweisungen für Datenbanken
ähneln. LINQ integriert mittels einer Reihe von Spracherweiterungen diese Abfragen direkt in
.NET-Sprachen wie C# und Visual Basic: LINQ bedeutet Language-INtegrated Query.
In der Zeit vor LINQ mussten Sie innerhalb C# oder VB.NET mit anderen Sprachen wie SQL,
XML oder XPath jonglieren, zusammen mit verschiedenen Technologien und APIs, wie ADO.NET
oder System.Xml. Es versteht sich, dass diese Vorgehensweise bestimmte Nachteile mit sich
brachte1. LINQ führt verschiedene Welten zusammen. Es hilft Ihnen, die Hindernisse zu umgehen,
die auf der Verbindungsstraße zwischen diesen Welten liegen. Das Zusammenführen von XML mit
Objekten, von Objekten mit relationalen Daten und von relationalen Daten mit XML sind einige
der Aufgaben, die LINQ deutlich vereinfacht.
1
"Es war so, als würden Sie Ihre Speisen in der einen und Ihre Getränke in der anderen Sprache bestellen" sagte Jason
McConnell, der Produktmanager für Visual Studio bei Microsoft. "Der direkte Nutzen ist der, dass die Programmierer
produktiver werden, weil sie nun einen einheitlichen Zugang für das Abfragen und Aktualisieren von Daten innerhalb
ihrer Programmiersprache haben."
1.1 Was ist LINQ?
29
Einer der Schlüsselaspekte von LINQ ist der, dass es für jeden beliebigen Objekttyp und für jede
beliebige Datenquelle mit dem Ziel konzipiert wurde, ein konsistentes Programmiermodell zur Verfügung zu stellen. Unabhängig von den verschiedenen Anwendungsmöglichkeiten bleiben Syntax
und Konzept dieselben: Wenn Sie wissen, wie man LINQ auf ein Array oder eine Collection
anwendet, dann kennen Sie auch die Konzepte, mit denen man mit LINQ auf eine Datenbank oder
eine XML-Datei zugreift.
Ein weiterer wichtiger Aspekt ist der, dass Sie mit LINQ in einer streng typisierten Welt arbeiten.
Die damit verbundenen Vorteile sind die, dass Ihre Abfragen bereits beim Kompilieren geprüft
werden und dass Sie bei deren Entwurf von Visual Studios Intellisense profitieren.
LINQ wird einige Aspekte Ihres bislang gewohnten Umgangs mit Daten in Ihren Applikationen
und Komponenten grundlegend ändern. Sie werden selbst bald feststellen, dass LINQ einen Schritt
vorwärts in die Richtung eines mehr deklarativen Programmiermodells bedeutet. Möglicherweise
wundern Sie sich auch darüber, warum Sie bislang so viele Zeilen Code für etwas geschrieben
haben, was sich mit LINQ in einer einzigen Zeile unterbringen lässt.
LINQ hat dualen Charakter. Sie können sich LINQ so vorstellen, als würde es aus zwei komplementären Teilen bestehen: eine Sammlung von Werkzeugen für das Arbeiten mit Daten und eine
Menge von Spracherweiterungen.
Zuerst werden wie Ihnen LINQ als Werkzeugsammlung für das Arbeiten mit Objekten, XMLDokumenten, relationalen Datenbanken oder anderen Arten von Daten vorstellen. Danach werden
Sie sehen, dass LINQ außerdem eine Erweiterung für bereits existierende Programmiersprachen,
wie C# und VB.NET, ist.
1.1.2 LINQ als Werkzeugsammlung
LINQ bietet Ihnen zahlreiche Möglichkeiten. In diesem Buch werden wir detailliert auf drei grundlegende LINQ-Provider eingehen – LINQ to Objects, LINQ to SQL und LINQ to XML. Genauer
tun wir das in den Teilen 2, 3 und 4. Diese drei LINQ-Provider bilden eine Familie von Werkzeugen, die einerseits separat für spezielle Aufgaben eingesetzt werden können, andererseits aber auch
zu leistungsfähigen Lösungen kombinierbar sind.
Obwohl wir uns in diesem Buch auf LINQ to Objects, LINQ to SQL und LINQ to XML konzentrieren, ist LINQ offen für neue Datenquellen. Die drei grundlegenden LINQ-Provider, wie sie
Gegenstand dieses Buchs sind, entstanden auf Basis der allgemeinen LINQ Foundation. Diese
besteht aus einer Menge von Bausteinen, wie Abfrageoperatoren, Abfrageausdrücke und Ausdrucks-Bäume (expression trees), die eine Erweiterbarkeit des LINQ-Toolsets ermöglichen.
Weitere LINQ-Varianten können für andere Arten von Daten erzeugt werden. Neue LINQ-Implementierungen werden nicht nur von Software-Herstellern entwickelt, auch Sie selbst können eigene
LINQ-Varianten kreieren (siehe Kapitel 12, LINQ-Erweiterungen). Sie können eine breite Vielfalt
von Datenquellen mit LINQ in Verbindung bringen, wie beispielsweise das Dateisystem, Active
Directory, WMI, das Windows Ereignisprotokoll oder irgendeine andere Datenquelle oder API.
Das ist exzellent, weil Sie von den LINQ-Features täglich profitieren können, egal mit welcher
Datenquelle Sie es gerade zu tun haben. Tatsächlich bietet Microsoft heute bereits mehr LINQ-
30
1 Einführung in LINQ
Provider an, als LINQ to Objects, LINQ to SQL und LINQ to XML. Zwei davon sind LINQ to
DataSet und LINQ to Entities (für die Arbeit mit dem neuen ADO.NET Entity Framework). Wir
werden diese Tools im zweiten und dritten Teil dieses Buchs besprechen. Doch zunächst sollten Sie
Ihre Aufmerksamkeit auf die folgende Abbildung richten.
Abbildung 1.1 LINQ-Konstrukte, LINQ-Provider und Datenquellen, die mit LINQ abgefragt werden können
Die LINQ-Provider in Abbildung 1.1 sind keine für sich allein stehenden Tools, sie können direkt
in Ihre Programmiersprache eingebunden werden. Dies ist möglich, weil das LINQ-Framework
eine Menge von Spracherweiterungen umfasst. Diesem zweiten Aspekt von LINQ werden wir uns
im nächsten Abschnitt widmen.
1.1.3 LINQ als Spracherweiterung
LINQ ermöglicht es Ihnen, in einer Programmiersprache Ihrer Wahl Abfragen für verschiedenste
Datenquellen zu schreiben und bietet dabei dieselben Fähigkeiten wie SQL. Das ist einfach großartig, denn dieser deklarative Ansatz erlaubt kürzeren und prägnanteren Code.
Listing 1.1 zeigt LINQ-Beispielcode in C#.
Listing 1.1
Abfrage einer Datenbank und Erzeugen eines XML-Dokuments mit LINQ
Customers aus der Datenbank lesen:
var contacts =
from customer in db.Customers
where customer.Name.StartsWith("A") && customer.Orders.Count > 0
orderby customer.Name
select new { customer.Name, customer.Phone };
C#
1.1 Was ist LINQ?
31
XML-Daten aus der Customers-Liste generieren:
var xml =
new XElement("contacts",
from contact in contacts
select new XElement("contact",
new XAttribute("name", contact.Name),
new XAttribute("phone", contact.Phone)
)
);
Das Listing zeigt alles was Sie brauchen, um Daten aus einer Datenbank zu extrahieren und daraus
ein XML-Dokument zu erzeugen. Stellen Sie sich einmal vor, wie Sie dasselbe Problem ohne
LINQ lösen würden, und Sie werden erkennen, dass es mit LINQ viel einfacher und natürlicher
geht. In Kürze werden Sie noch mehr LINQ Abfragen kennen lernen, jetzt aber wollen wir unseren
Fokus auf die sprachlichen Aspekte richten. Aus den from-, where-, orderby- und select-Schlüsselwörtern im obigen Listing geht klar hervor, dass die Sprache C# mit LINQ-Fähigkeiten erweitert
wurde.
Wir haben Ihnen gerade Code gezeigt, der in C# geschrieben wurde, aber LINQ stellt eine allgemeine Abfrage-Architektur für alle .NET-Programmiersprachen zur Verfügung. Das funktioniert
mit C# 3.0 und mit VB.NET 9.0 (VB 2008). Der Code erfordert allerdings angepasste Compiler,
kann aber nach anderen .NET Sprachen portiert werden. Dies ist bereits der Fall für F#, eine funktionelle .NET-Sprache von Microsoft Research, in Zukunft ist LINQ-Support für weitere .NETSprachen zu erwarten.
Abbildung 1.2 LINQ als Spracherweiterung und als ein Gateway zu verschiedensten Datenquellen
Index
Index
.NET Framework-Support 45
.NET Reflector 94
1:1-Beziehungen 256
3-Schichten-Architektur 469
A
Abfrageausdrücke 115, 264
Abfragen zur Laufzeit 195
Abfrageoperatoren 111, 528
Achseneigenschaften 360
Action 127
Active Directory 492
Add 341
AddAfterSelf 326, 341
AddAnnotation 325
AddBeforeSelf 326, 341
AddFirst 326, 341
AddWithValue 33
ADO.NET 221
ADO.NET Entity Framework 494
ADO.NET-API 40
Aggregat-Operatoren 161
Aggregate 114
Aggregation 114, 236
All 114, 118, 241
Amazon 483
Amazon.com-Webdienst 457
AmazonBook 456
AmazonBookExpressionVisitor 452, 463
AmazonBookSearch 458
AmazonHelper 456
AmazonHelper.cs 457
Ancestors 326, 357
AncestorsAndSelf 326, 357
Änderungen durchführen 271
Änderungen verfolgen 270
Annotation 326
Annotations 326
Anonyme Methoden 65, 78
Anonyme Typen 93
ANSI-82 SQL-Syntax 237
ANSI-92 SQL-Syntax 237
Any 114, 118, 241
Array 137
AsDataView 526
AsEnumerable 114
ASP.NET 142
ASP.NET-Session 487
ASP.NET-Website 142
AsQueryable 114
Association 241, 252
Association-Attribut 256
Attach 274
Attribute 345, 352
Attribute-Achseneigenschaft 363
AuditTracking 292
Ausdrucksbäume 65, 266
Author 133
Author.aspx.cs 482
AutoSync 253
Average 114, 118
544
Index
B
Base Class Discriminator 307
Basis-Abfrageausdrücke 436
Basisklasse 305
Bedingungsabhängige Abfragen 192
BeginTransaction 285
Beispielanwendung 131
Benutzerdefinierte Funktionen 296
Benutzerdefinierte Sortierung 189
Benutzerspezifische Abfrageoperatoren 429, 490
Beziehungen 522
Book 133
Books 434
Books.aspx.cs 480
C
C-Omega-Sprache 43
C# 46
CanBeNull 253
Cast 114, 118, 182
catch 282
ChangeConflictException 280, 281
CheckRules 303
Child-Achseneigenschaft 361
CiteSeer 492
Client 222
Collection-Initialisierer 73
Column 225, 252
Column-Attribut 253
CompiledQuery.Compile 300
CommandText 33
Compiler 45
Concat 114
Concatenation 114
Conceptual Schema Definition Language 312
Console 228
Constant 267
Constraint 500
Contains 114, 233, 448
Content 332
Content einfügen 340
Content löschen 342
ContinueOnConflict 282, 285
Conversion 114
CopyToDataTable 507, 523
Count 114, 118, 162, 168
CreateCommand 33
CreateDatabase 254
CreateMethodCallQuery<T> 299
CreateNavigator 371
CreateQuery 265
CreateWriter 376
Cross Join 172, 238
CRUD 226, 292
CSDL 312
CSV 198, 417
CustomImplementation 440
CustomSort 190
CȦ 43
D
DAL 470, 473
DataLoadOptions 246
DataAdapter 504
Database 252
DataBind 145, 177
DataColumn 500
DataContext 60, 227
DataGridView 505, 523
DataList 142, 145
DataRelation 500
DataRow 500, 510, 528
DataRow-Vergleich 529
DataRowComparer 529
DataSet 486, 497, 498
DataSet-Designer 516
DataSource 144, 505
DataTable 500
DataTable.Select 508
DataTables verknüpfen 512
DataView 509, 526
Daten lesen 288
Datenbankschema 134
Datenbanksystem 221
Datenbankzugriff 33
Datenbindung 142, 149
545
Index
Datenentitäten 471
Datenimport 483
Datenmapping 225
Datenmodell 468
Datenzugriffsschicht 469, 470
DateTime.Parse 234
DB_Linq 492
DBML-Datei 263
DbType 254
DefaultIfEmpty 114, 155, 238
deferred query execution 243
Deklaratives Modell 52
Delegates 76
DeleteOnNull 256
DeleteOnSubmit 248
DeleteRule 256
Derived Class Discriminator 307
DescendantAndSelf 326
Descendants 326, 355
Descendants-Achseneigenschaft 362
DescendantsAndSelf 355
descending 234
Design Pattern 200
Dictionary 139, 140
Discriminator Property 307
Distinct 114, 118, 159, 529
Document Type Definition 322
Dokument-zentriert 52
DOM 40, 320
domänenspezifische Operatoren 443
DropDownList 145
DTD 322
Dynamische Abfragen 187
E
EDM 311
EF 312
Eigenschaftendeklaration 225
Eingebettete Abfragen 164
Einschränkungen 120
Einschränkungs-Operator 155
Element 114, 326, 352
Element-zentriert 52
ElementAt 114, 362
ElementAtOrDefault 114
Elements 326, 354
ElementsAfterSelf 326, 359
ElementsBeforeSelf 326, 359
Empty 114, 155
EndsWith 233
Entitäten 269
Entity Data Model 311
Entity-Klassen 59
Entity-Relationship 311
EntitySpaces 493
Entwurfsmuster 200
Entwurfsziele 42
Enumerable.Where 440
Enumerable.Select 440
Equality 114
ErrorProvider 303
Erste Schritte 51
Erweiterbarkeit 490
Erweiterungsmechnismen 426
Erweiterungsmethoden 84
Escape-Sequenz 199
Except 114, 529
Execute 265
ExecuteMethodCall 290
ExecuteQuery 287
ExecuteReader 33
Expression Tree 196
Expression 127, 254, 265
Expression Trees 122
Extension Indexer 362
F
FailOnFirstConflict 282
Fehlanpassung 35
Field 510
Field<T> 528
Fill 505
Filtering 114
Filtern 232, 366
First 114
FirstOrDefault 114
Flickr 492
ForEach-Pattern 203
546
Index
Format 287
Framework 45
Fremdschlüssel 306
FromReader 259
FromStream 259
FromUrl 259
FromXml 259
Func 127
Function 252
Functional Construction Pattern 57
Funktionale Konstruktion 200, 321
G
Generation 114
Generics 67, 182
Generische Dictionaries 139
Generische Listen 138
Genome 493
Geschäfts-Entitäten 133
Geschäftsebene 300, 469
Geschäftsentität 311
Geschäftslogik 301
Gespeicherte Prozeduren 288, 292
GetChildRows 513
GetCurrentMethod 290
GetParentRow 513
GetParentRows 513
GetProcesses 66, 67
GetQueryText 462
GetStringValue 343
GetTable 228
Google Desktop 492
Google Groups 492
Google Image 492
GreaterThan 267
GridView 142
group 167, 185
GroupBy 114, 119
Grouping 114
GroupJoin 114, 119
Gruppieren 93, 167, 184, 234, 368
Gruppierungs Join 169
GUI-Bindung 523
H
Hello LINQ 47, 53
I
IDataErrorInfo 302
IEnumerable 341
IEnumerable<T> 104
IExecuteResult 291
IGrouping 168
Imperatives Modell 52
Implizit typisierte Variablen 69
Import-Operation 486
In-Memory-Collection 136
In-Memory-Datenbank 497, 499
Index 158
Inhalte ändern 343
Inheritance Default 307
InheritanceMapping 252
Inline-Attribute 252
Inner Join 170, 242
InsertOnSubmit 248, 274
Intersect 114, 529, 530
into 185
IQueryable 125, 264, 458
IQueryable<T> 228
IQueryProvider 458
IsComposable 298
IsDbGenerated 254
IsDiscriminator 308
IsDiscriminator 254
IsExpensive 435
IsForeignKey 256
ISingleResult<T> 291
IsPrimaryKey 226, 254
IsUnique 256
IsVersion 254
Iterator Pattern 105
Iteratoren 65, 105
547
Index
J
Join 114, 119
Joining 237
Joins 168
K
KeepChanges 282
KeepCurrentValues 282
Klassendefinition 301
Klassendiagramm 133
Kollision von Abfrageausdrücken 442
Kompilierte Abfragen 300
Konfliktbehandlung 285
Konkurrenz-Ausnahmen 281
Konvertierungsoperatoren 160
L
Lambda 267
Lambda-Ausdrücke 76, 78
Lambda-Kalkül 76
Lambda-Operator 80
Last 114
LastOrDefault 114
lazy loading 243
Lebenszyklus 269, 313
Left Outer Join 171
LIKE 233
LINQ 28
LINQ to Amazon 447
LINQ to DataSet 486, 497
LINQ to Entities 310, 427, 493, 494
LINQ to Objects 45, 131, 489
LINQ to SQL 58, 221
LINQ to SQL-Designer 252, 262
LINQ to Text Files 197
LINQ to XML 51, 317, 483
LINQ to XSD 493
LINQ-DLLs 126
LINQ-Erweiterung 428
LINQ-Flavours 426
LINQ-Foundation 103
LINQ-Konstrukte 30
LINQ-Projekt 42
LINQ-Provider 30, 447, 491
LinqBooks 131
LinqBooks-Applikation 465
LinqBooksDataSet 515
LinqDataSource 145
LinqInAction.Extensibility 440
List 139
Listenanzeige 145
LLBLGen Pro 493
Load 326, 328
LoadOptions 328
LoadSequence 507, 520
Log 228
Logische Schicht 469
lokale Namen 322
LongCount 114, 119
LongSum 429
M
Mapping 36, 225, 251
Mapping Schema Language 312
Max 114, 119, 162, 168
Mehrfachkriterien 184
Mehrschichtarchitektur 471
Metadaten 300
MetaLinq 492
MethodInfo 290
MethodInvoker 81
Min 114, 119, 162, 168, 434
MSL 312
Muster für Abfrageausdrücke 438
MySql 492
N
Name 254, 256
Namenlose Typen 93
Namensräume 126
Namespace-Kollision 442
Namespace-Präfixe 322, 334
Netzwerkbelastung 222
Neuimplementierung 436
NHibernate 38, 492
nichtgenerische Collection 182
Nodes 326
548
Index
NodesBeforeSelf 359
NodesAfterSelf 326, 359
NodesBeforeSelf 326
Non-Sequence Operator 445
O
O/R-Mapper 251
ObjectDumper 67, 137, 244
ObjectSpaces 42, 44
ObjectTrackingEnabled 273
Objekt-XML-Mapping 39
Objektbäume 240, 385
Objektdefinitionen 133
Objektgraph 162
Objekthierarchie 240
Objektinitialisierer 72
Objektmodell 133
Objektrelationales Mapping 36
OfType 114, 184
OleDbDataAdapter 505
Optimistische Konkurrenz 278
Oracle 492
OracleDataAdapter 505
ORDER BY 234
orderby 114, 119, 163, 234
OrderByDescending 87, 114, 119, 163
OrderedSequence 189
Ordering 114
OtherKey 256
Outer Join 238, 241
Output-Stream 228
OverflowException 429
Overhead 213
OverwriteCurrentValues 282
P
Paging 174
Paradigmenunterschiede 37
Parallel Computing 494
Parameter 252, 267
Parametrierte Abfragen 187
Parent 326, 351
Parse 326
Parsen 199
Partielle Klassen 301
Partielle Methoden 303
Partitionieren 174
Partitioning 114
Performance 205, 210
PerformWebQuery 457
Pessimistische Konkurrenz 278
Pipeline 90
Pipeline-Pattern 126
Platzhalter 336
PLINQ 494
POCO 471
PostgreSQL 492
Präsentationsschicht 469
Predicate<T> 77
PreserveWhitespace 328
Process 67
ProcessData 69
ProcessExpression 453
processing instructions 322
ProcessName 67
Projection 114
Projektion 365
Projektions-Operator 156
Property 267
Protokollfunktion 228
Provider 252
Proxy 290
Publisher 133
Publishers.aspx.cs 477
Q
qualifizierte Namen 322
Quantifiers 114
Query Visualizer 228
QueryProvider 462
R
RAD 471, 472
Range 114, 155
RDF 492
ReadAllLines 198
549
Index
RefreshMode 281, 282
Relationale Daten 251
Relationen 513
remote evaluation 447
Remove 342
RemoveAttributes 326
RemoveAll 326
RemoveAnnotation 325
RemoveNodes 326
Repeat 114, 155
Repeater 142
ReplaceNodes 326, 343
ReplaceWith 344
ResultType 253
ReturnAGeneric 96
Reverse 114, 209
Review 133
RowVersion 280
RSS-Feed 328, 385
RSS-Feeds 485
S
Save 326
Select 114, 119, 156, 365
SelectedIndex 177
SelectedValue 177
SelectMany 114, 119, 157
SequenceEqual 114, 155
Sequenz 103
Set 114
SetBaseUri 328
Set-Operatoren 529
SetAttributeValue 326, 345
SetElementValue 326, 343
SetField<T> 528
SetLineInfo 328
SharePoint 492
Silverlight-Runtime 46
Simultane Änderungen 277
Single 114
SingleOrDefault 114
Skip 114, 119, 176, 230
SkipWhile 114, 119
Slinq 492
Software 45
SortedDictionary 139
SortedList 139
Sortieren 234, 368
Sortierschlüssel 189
Sortierung 162
Sperrmechanismus 278
Split 198, 201
Spracherweiterung 30
Spracherweiterungen 65, 101
SQL 223
SQL pass-through 287
SQL Server 221
SQL Server 2005 46
SQL Server Profiler 228
SqlDataSource 472
SQL-Filteroption 233
SqlConnection 33
SqlDataReader 33
SqlMetal 252, 259
SqlMetal.exe 393
SQLXML 40
SSDL 312
Standard-Abfrageoperatoren 87, 114, 154, 363
StartsWith 233
stdin 90
stdout 90
Storage 254, 256
Store Schema Definition Language 312
Streaming-Strategie 206
StreamReader 206
String 140
Subject 133
SubmitChanges 247, 271
Sum 89, 114, 119, 162, 168
SybaseDataAdapter 505
SyncLINQ 492
System.Predicate<T> 81
System.Action<T> 81
System.Collections.Generic 66
System.Collections.Generic.HashSet<T> 138
System.Collections.Generic.LinkedList<T> 138
System.Collections.Generic.List<T> 138
System.Collections.Generic.Queue<T> 138
System.Collections.Generic.Stack<T> 138
550
Index
System.Collections.ObjectModel.Collection<T> 138
System.ComponentModel.BindingList<T> 138
System.Converter<TInput, TOutput> 81
System.Core.dll 127
System.Data 500
System.Data.DataSet 500
System.Data.Linq.dll 127
System.Data.Linq.Mapping 127
System.Data.Linq.XmlMappingSource 259
System.Data.TypedTableBase 503
System.Diagnostics 66
System.Enumerable.Linq.Join 238
System.Linq 126
System.Linq.Expressions 127
System.Transactions 285
System.Xml.Linq 46, 127
System.Xml.Linq.dll 127
System.Xml.Schema 127
System.Xml.XPath 127, 371
System.Xml.Xsl 376
T
Table 253
Table-Attribut 253
TableAdapter 486, 518
TableMappings 505
Take 88, 114, 119, 176, 230
TakeWhile 114, 119
Textdatei 417
ThenBy 114, 119, 163
ThenByDescending 114, 119, 163
this 84
ThisKey 256
TimeStamp 275
Title 225
ToArray 114, 160, 245
ToDataTable 507
ToDictionary 114, 161, 245
ToList 114, 151, 160, 245
ToLookup 114, 245
ToString 234
TotalPrice 433, 490
Träges Laden 243
TransactionScope 285
Transaktion 284
try 282
Typisierte DataSets 501, 514
U
Übersetzungsmechanismus 437
Union 114, 529
Unterabfrage 211
Unterabfragen 246
Untypisiertes DataSet 503
UpdateCheck 254, 275, 280
User 133, 306
UserBase 306
V
Value 342
Value Extension 362
Vanatec OpenAccess 493
var 69
VB.NET 46
Verbindungslose Daten 274
Verbindungszeichenfolge 227
Vereinfachte Namen 322
Vererbung 305
Vererbungsmodell 310
verzögerte Ausführung 107, 125, 243
Visual Basic 2008 46
Visual C# 2008 46
W
W3C XML-Schema 39
Webanwendungen 142
What You See Is What You Mean 57
WhenChanged 280
WhenChanged 281
Where 111, 114, 119, 155, 187, 232, 237, 366
whitespaces 328
Windows Forms 142, 149
WmiLinq 492
WriteTo 326
WYSIWYM 57
551
Index
X
XAttribute 322, 326, 345
XCData 327
XComment 327, 329, 338, 340
XContainer 326
XDeclaration 327, 329, 338
XDocument 326, 337
XDocumentType 327, 329, 338, 339
XElement 322, 326, 338
XML erzeugen 331
XML laden 328
XML parsen 330
XML speichern 346
XML transformieren 373
XML verarbeiten 327
XML-Abfrage 51
XML-Achsen-Methoden 350
XML-API 317
XML-Baum 393
XML-Dokument 337, 486
XML-DOM 318
XML-Klassenhierarchie 325
XML-Literale 335
XML-Mapping-Datei 257
XmlMappingSource 259
XMLNamespaceManager 324
XmlReader 328
XmlWriter 326, 376
XName 322, 327
XNamespace 327
XNode 326
XObject 325
XPath 40, 318, 371
XPathEvaluate 371
XPathNavigators 371
XPathSelectElement 371
XPathSelectElements 371
XProcessingInstruction 327, 329, 338
XQuery 44, 318
XSD 40
XSL 40
XslCompiledTransform 376
XSLT 376
XStreamingElement 327
XText 327, 332
Z
Zuordnung 225
Zwei Wege-Datenbindung 526
Herunterladen