Grundlagen der LINQ-Syntax

Größe: px
Ab Seite anzeigen:

Download "Grundlagen der LINQ-Syntax"

Transkript

1 Kapitel 2 Grundlagen der LINQ-Syntax In diesem Kapitel: LINQ-Abfragen 24 Abfrageschlüsselwörter 29 Verzögerte Auswertung von Abfragen und Auflösung von Erweiterungsmethoden 41 Abschließende Gedanken zu LINQ-Abfragen 45 Zusammenfassung 48 23

2 24 Kapitel 2: Grundlagen der LINQ-Syntax Sprachintegrierte Abfrage (Language Integrated Query, LINQ) ermöglicht Entwicklern, Sequenzen von Elementen (Objekte, Entitäten, Datenbankdatensätze, XML-Knoten usw.) innerhalb ihrer Softwareprojekte mit einer gemeinsamen Syntax und einer einheitlichen Programmiersprache unabhängig von der Herkunft der behandelten Elemente abzufragen und zu verwalten. Das Schlüsselfeature von LINQ ist die Integration in weit verbreitete Programmiersprachen. Diese Integration wird ermöglicht durch die Verwendung einer für alle Arten von Inhalten gemeinsamen Syntax. Wie Kapitel 1 erläutert hat, stellt LINQ eine grundlegende Infrastruktur für viele unterschiedliche Implementierungen von Abfragemodulen bereit. Dazu gehören LINQ to Objects, LINQ to SQL, LINQ to DataSet, LINQ to Entities, LINQ to XML usw. Alle diese Abfrageerweiterungen basieren auf spezialisierten Erweiterungsmethoden und nutzen für die Abfrageausdruckssyntax einen gemeinsamen Satz von Schlüsselwörtern, die in diesem Kapitel behandelt werden. Bevor wir uns die einzelnen Schlüsselwörter im Detail ansehen, gehen wir verschiedene Aspekte einer einzelnen LINQ-Abfrage durch und führen in die grundlegenden Elemente der LINQ-Syntax ein. LINQ-Abfragen LINQ basiert auf einem Satz von Abfrageoperatoren, die als Erweiterungsmethoden definiert sind und mit jedem Objekt arbeiten, das die Schnittstelle IEnumerable<T> oder IQueryable<T> implementiert. HINWEIS Die Anhänge B und C enthalten weitere Details zu Erweiterungsmethoden. Durch dieses Konzept wird LINQ zu einem universellen Abfrageframework, weil viele Auflistungen oder Typen IEnumerable<T> bzw. IQueryable<T> implementieren und jeder Entwickler seine eigene Implementierung definieren kann. Außerdem ist diese Abfrageinfrastruktur äußerst erweiterbar, wie Sie noch in Kapitel 12 sehen werden. Mit der Architektur können Entwickler das Verhalten einer Methode basierend auf dem Typ der abzufragenden Daten spezialisieren. Zum Beispiel besitzen sowohl LINQ to SQL als auch LINQ to XML spezialisierte LINQ-Operatoren, um relationale Daten bzw. XML-Knoten zu verarbeiten. Abfragesyntax Die Einführung in die Abfragesyntax beginnt mit einem einfachen Beispiel. Nehmen Sie an, Sie müssen ein Array von Objekten eines Typs Developer mit LINQ to Objects abfragen und die Namen der Entwickler extrahieren, die C# als Hauptprogrammiersprache verwenden. Listing 2.1 zeigt, wie der Code aussehen könnte. using System; using System.Linq; using System.Collections.Generic; public class Developer { public string Name; public string Language; public int Age;

3 LINQ-Abfragen 25 class App { static void Main() { Developer[] developers = new Developer[] { new Developer {Name = "Paolo", Language = "C#", new Developer {Name = "Marco", Language = "C#", new Developer {Name = "Frank", Language = "VB.NET"; var developersusingcsharp = from d in developers where d.language == "C#" select d.name; foreach (var item in developersusingcsharp) { Console.WriteLine(item); Listing 2.1 Ein einfacher Abfrageausdruck in C# 3.0 Als Ergebnis liefert dieser Code die Namen Paolo und Marco. In Visual Basic 2008 lässt sich die gleiche Abfrage (und für den gleichen Typ Developer) mit einer Syntax ausdrücken, wie sie Listing 2.2 zeigt. Imports System Imports System.Linq Imports System.Collections.Generic Public Class Developer Public Name As String Public Language As String Public Age As Integer End Class Module App Sub Main() Dim developers As New Developer() { _ New Developer With {.Name = "Paolo",.Language = "C#", _ New Developer With {.Name = "Marco",.Language = "C#", _ New Developer With {.Name = "Frank",.Language = "VB.NET" Dim developersusingcsharp = _ From d In developers _ Where d.language = "C#" _ Select d.name For Each item in developersusingcsharp Console.WriteLine(item) Next End Sub End Module Listing 2.2 Ein einfacher Abfrageausdruck in Visual Basic 2008

4 26 Kapitel 2: Grundlagen der LINQ-Syntax Die Syntax der Abfragen (in den Listings 2.1 und 2.2 fett gedruckt) bezeichnet man als Abfrageausdruck. In manchen LINQ-Implementierungen spricht man bei einer speicherresidenten Darstellung dieser Abfragen von einer Ausdrucksbaumstruktur. Ein Abfrageausdruck operiert auf einer oder mehreren Informationsquellen, indem einer oder mehrere Abfrageoperatoren entweder aus der Gruppe der Standardabfrageoperatoren oder aus der Gruppe der domänenspezifischen Operatoren angewandt werden. Im Allgemeinen liefert die Auswertung eines Abfrageausdrucks eine Folge von Werten. Ein Abfrageausdruck wird nur dann ausgewertet, wenn sein Inhalt aufgezählt wird. Kapitel 11 gibt weitere Einzelheiten zu Abfrageausdrücken und Ausdrucksbaumstrukturen an. HINWEIS Im Sinne einer einfachen Darstellung zeigen wir in den folgenden Beispielen nur die C# 3.0-Syntax. Die Visual Basic 2008-Version dieses Beispiels ist aber der C# 3.0-Version sehr ähnlich. Diese Abfragen lesen sich fast wie SQL-Anweisungen, auch wenn ihr Format etwas abweicht. Der hier definierte Beispielausdruck besteht aus einem Auswahlbefehl select d.name der auf eine Gruppe von Elementen angewandt wird from d in developers wobei als Ziel der from-klausel jede Instanz einer Klasse infrage kommt, die die Schnittstelle IEnumerable<T> implementiert. Die Auswahl wendet eine bestimmte Filterbedingung an: where d.language == "C#" Die Sprachcompiler übersetzen diese Klauseln in Aufrufe von Erweiterungsmethoden, die sequenziell auf das Ziel der Abfrage angewandt werden. Die in der Assembly System.Core.dll untergebrachte Kernbibliothek von LINQ definiert einen Satz von Erweiterungsmethoden, die nach Ziel und Zweck gruppiert sind. Zum Beispiel enthält die Assembly eine Klasse Enumerable, die zum Namespace System.Linq gehört. Sie definiert Erweiterungsmethoden, die sich auf Instanzen von Typen anwenden lassen, die die Schnittstelle IEnumerable<T> implementieren. Die in der Beispielabfrage definierte Filterbedingung (where) wird in einen Aufruf der Where- Erweiterungsmethode der Klasse Enumerable übersetzt. Die beiden Überladungen dieser Methode übernehmen einen Delegaten für eine predicate-funktion, die die zu überprüfende Filterbedingung beschreibt, während die Ergebnisdaten partitioniert werden. In diesem Fall ist die filternde predicate-funktion ein generischer Delegat. Er übernimmt ein Element vom Typ»T«, d. h. vom selben Typ wie die Instanzen, die in der zu filternden Aufzählung gespeichert sind. Der Delegat liefert ein boolesches Ergebnis, das die Mitgliedschaft des Elements in der gefilterten Ergebnismenge angibt: public static IEnumerable<T> Where<T>( this IEnumerable<T> source, Func<T, bool> predicate); Wie aus der Methodensignatur hervorgeht, können Sie diese Methode für jeden Typ aufrufen, der IEnumerable<T> implementiert, folglich auch für das developers-array des Beispiels:

5 LINQ-Abfragen 27 var filtereddevelopers = developers.where(delegate (Developer d) { return (d.language == "C#"); ); Hier stellt das an die Where-Methode übergebene predicate-argument einen anonymen Delegaten zu einer Funktion dar, die für jedes Element des Typs Developer aufgerufen wird, das aus der Quelldatenmenge (developers) stammt. Der Aufruf der Where-Methode liefert eine Teilmenge von Elementen: alle diejenigen Elemente, die der predicate-bedingung genügen. In C# 3.0 und Visual Basic 2008 kann ein anonymer Delegat in einfacherer Weise mit einem Lambda- Ausdruck definiert werden. Der Code für das Filterbeispiel lässt sich dann wie folgt kompakter formulieren: var filtereddevelopers = developers.where(d => d.language == "C#"); WICHTIG In den Anhängen B und C finden Sie weitere Einzelheiten zur Syntax von Erweiterungsmethoden, Lambda- Ausdrücken, anonymen Delegaten usw. Die select-anweisung ist ebenfalls eine Erweiterungsmethode (namens Select), die von der Klasse Enumerable bereitgestellt wird. Die Signatur der Methode Select sieht so aus: public static IEnumerable<TResult> Select<TSource, TResult>( this IEnumerable<TSource> source, Func<TSource, TResult> selector); Das Argument selector ist eine Projektion, die eine Aufzählung von Objekten des Typs TResult zurückgibt. Die Aufzählung wird von einem Satz von Quellobjekten des Typs TSource abgerufen. Genau wie im obigen Beispiel lässt sich diese Methode mithilfe eines Lambda-Ausdrucks auf die gesamte developers-auflistung anwenden. Es ist auch möglich, die Methode auf der von der Programmiersprache gefilterten Auflistung (namens filtereddevelopers) aufzurufen, weil es sich dabei immer noch um einen Typ handelt, der IEnumerable<T> implementiert: var csharpdevelopersnames = filtereddevelopers.select(d => d.name); Aufbauend auf der eben beschriebenen Sequenz von Anweisungen lässt sich die Beispielabfrage ohne Verwendung der Abfrageausdruckssyntax neu formulieren: IEnumerable<string> developersusingcsharp = developers.where(d => d.language == "C#").Select(d => d.name); Die Methoden Where und Select übernehmen Lambda-Ausdrücke als Argumente. Diese Lambda-Ausdrücke werden in Prädikate und Projektionen übersetzt, die auf einem Satz von generischen Delegattypen basieren, die in der Assembly System.Core.dll des Namespaces System definiert sind. Die komplette Familie der generischen Delegattypen sieht folgendermaßen aus:

6 28 Kapitel 2: Grundlagen der LINQ-Syntax public delegate TResult Func< TResult >(); public delegate TResult Func< T, TResult >( T arg ); public delegate TResult Func< T1, T2, TResult > (T1 arg1, T2 arg2 ); public delegate TResult Func< T1, T2, T3, TResult > ( T1 arg1, T2 arg2, T3 arg3 ); public delegate TResult Func< T1, T2, T3, T4, TResult > (T1 arg1, T2 arg2, T3 arg3, T4 arg4 ); Viele Erweiterungsmethoden der Klasse Enumerable übernehmen diese Delegaten als Argumente und die Beispiele in diesem Kapitel greifen ebenfalls darauf zurück. Die endgültige Version der anfänglichen Abfrage könnte wie in Listing 2.3 aussehen. Func<Developer, bool> filteringpredicate = d => d.language == "C#"; Func<Developer, string> selectionpredicate = d => d.name; IEnumerable<string> developersusingcsharp = developers.where(filteringpredicate).select(selectionpredicate); Listing 2.3 Der erste in grundlegende Elemente übersetzte Abfrageausdruck Genau wie der Visual Basic 2008-Compiler übersetzt der C# 3.0-Compiler die LINQ-Abfrageausdrücke (Listing 2.1 und Listing 2.2) in eine Anweisung ähnlich der in Listing 2.3. Wenn Sie sich einmal mit der Abfrageausdruckssyntax (Listing 2.1 und Listing 2.2) vertraut gemacht haben, ist es einfacher und leichter, die Syntax zu schreiben und zu verwalten, selbst wenn sie optional ist und Sie immer auf die äquivalente wortreichere Version (Listing 2.3) zurückgreifen können. Trotzdem ist es manchmal notwendig, eine Erweiterungsmethode direkt aufzurufen, weil die Abfrageausdruckssyntax nicht alle möglichen Erweiterungsmethoden abdeckt. WICHTIG Kapitel 3 geht ausführlicher auf alle Erweiterungsmethoden ein, die in der Klasse Enumerable des Namespaces System.Linq definiert sind. Vollständige Abfragesyntax Im vorherigen Abschnitt wurde eine einfache Abfrage über eine Liste von Objekten beschrieben. Die Abfragesyntax ist allerdings umfangreicher und stärker gegliedert als in diesem Beispiel gezeigt. Dabei gibt es für die Programmiersprachen viele verschiedene Schlüsselwörter, die den meisten Abfrageszenarios genügen. Jede Abfrage beginnt mit einer from-klausel und endet entweder mit einer select-klausel oder einer group-klausel. Im Unterschied zur SQL-Syntax beginnt die Abfrage nicht mit einer select-anweisung, sondern mit einer from-klausel. Neben anderen technischen Gründen hängt das vor allem damit zusammen, Microsoft IntelliSense für den restlichen Teil der Abfrage bereitzustellen, um das Formulieren von Bedingungs-, Auswahl- und anderen Abfrageausdrucksklauseln zu erleichtern. Eine select-klausel projiziert das Ergebnis eines Ausdrucks in ein aufzählbares Objekt. Eine group-klausel projiziert das Ergebnis eines Ausdrucks basierend auf einer Gruppierungsbedingung in einen Satz von Gruppen, wobei jede Gruppe ein aufzählbares Objekt darstellt. Der folgende Code zeigt einen Prototyp für die vollständige Abfrageausdruckssyntax:

7 Abfrageschlüsselwörter 29 query-expression ::= from-clause query-body query-body ::= join-clause* (from-clause join-clause* let-clause where-clause)* orderby-clause? (select-clause groupby-clause) query-continuation? from-clause ::= from itemname in srcexpr select-clause ::= select selexpr groupby-clause ::= group selexpr by keyexpr Auf die erste from-klausel können null oder mehr from-, let- oder where-klauseln folgen. Eine let-klausel weist dem Ergebnis eines Ausdrucks einen Namen zu. Diese Klausel ist nützlich, wenn Sie denselben Ausdruck mehrmals innerhalb einer Abfrage referenzieren müssen. let-clause ::= let itemname = selexpr Wie bereits erwähnt, definiert eine where-klausel einen Filter, der angewandt wird, um spezifische Elemente in die Ergebnisse einzuschließen. where-clause ::= where predexpr Jede from-klausel generiert eine lokale Bereichsvariable. Sie entspricht den einzelnen Elementen in der Quellsequenz, auf die Abfrageoperatoren (wie zum Beispiel die Erweiterungsmethoden von System.Linq. Enumerable) angewandt werden. Auf eine from-klausel können beliebig viele join-klauseln folgen. Vor der abschließenden select- oder group- Klausel können Sie mit einer orderby-klausel angeben, wie die Ergebnisse sortiert werden sollen: join-clause ::= join itemname in srcexpr on keyexpr equals keyexpr (into itemname)? orderby-clause ::= orderby (keyexpr (ascending descending)?)* query-continuation ::= into itemname query-body Das ganze Buch hindurch finden Sie Beispiele für Abfrageausdrücke. Nutzen Sie diesen Abschnitt als Referenz, wenn Sie bestimmte Elemente Ihrer Syntax überprüfen möchten. Abfrageschlüsselwörter In den folgenden Abschnitten werden die verschiedenen Abfrageschlüsselwörter behandelt, die in der Abfrageausdruckssyntax verfügbar sind.

8 30 Kapitel 2: Grundlagen der LINQ-Syntax Die Klausel from Das erste Schlüsselwort ist die from-klausel. Sie definiert die Datenquelle einer Abfrage oder Unterabfrage und eine Bereichsvariable, die jedes einzelne aus der Datenquelle abzufragende Element definiert. Als Datenquelle kommt jede Instanz eines Typs infrage, der die Schnittstellen IEnumerable, IEnumerable<T> oder IQueryable<T> (die IEnumerable<T> implementiert) implementiert. Das folgende Codefragment zeigt eine Beispielanweisung in C# 3.0, die diese Klausel verwendet. from rangevariable in datasource Der Sprachcompiler leitet den Typ der Bereichsvariablen aus dem Typ der Datenquelle ab. Ist zum Beispiel die Datenquelle vom Typ IEnumerable<Developer>, erhält die Bereichsvariable den Typ Developer. In den Fällen, in denen Sie keine stark typisierte Datenquelle verwenden beispielsweise eine ArrayList von Objekten des Typs Developer, die IEnumerable implementiert, sollten Sie den Typ der Bereichsvariablen explizit angeben. Listing 2.4 zeigt ein Beispiel für eine derartige Abfrage mit einer expliziten Deklaration des Typs Developer für die Bereichsvariable d. ArrayList developers = new ArrayList(); developers.add(new Developer { Name = "Paolo", Language = "C#" ); developers.add(new Developer { Name = "Marco", Language = "C#" ); developers.add(new Developer { Name = "Frank", Language = "VB.NET" ); var developersusingcsharp = from Developer d in developers where d.language == "C#" select d.name; foreach (string item in developersusingcsharp) { Console.WriteLine(item); Listing 2.4 Ein Abfrageausdruck für eine nicht generische Datenquelle mit Typdeklaration für die Bereichsvariable Im obigen Beispiel ist die Typumwandlung obligatorisch. Andernfalls lässt sich die Abfrage nicht kompilieren, weil der Compiler nicht in der Lage ist, den Typ der Bereichsvariablen automatisch abzuleiten. Dabei geht die Fähigkeit verloren, den Language- und Name-Memberzugriff in derselben Abfrage aufzulösen. Abfragen können mit mehreren from-klauseln Verknüpfungen zwischen mehreren Datenquellen definieren. In C# 3.0 verlangt jede Datenquelle die Deklaration einer from-klausel, wie es in Listing 2.5 zu sehen ist, das Kunden mit ihren Bestellungen verknüpft. Beachten Sie bitte, dass die Beziehung zwischen Customer und Order durch die Anwesenheit eines Orders-Arrays vom Typ Order in jeder Instanz von Customer physisch definiert ist. WICHTIG Wenn Sie mehrere from-klauseln verwenden, wird die Verknüpfungsbedingung durch die Struktur der Daten bestimmt und unterscheidet sich vom Konzept einer Verknüpfung in einer relationalen Datenbank. (Hierfür müssen Sie die join- Klausel in einem Abfrageausdruck verwenden, was später in diesem Kapitel erläutert wird.)

9 Abfrageschlüsselwörter 31 public class Customer { public String Name { get; set; public String City { get; set; public Order[] Orders { get; set; public class Order { public Int32 IdOrder { get; set; public Decimal EuroAmount { get; set; public String Description { get; set; //... Code weggelassen... static void querywithjoin() { Customer[] customers = new Customer[] { new Customer { Name = "Paolo", City = "Brescia", Orders = new Order[] { new Order { IdOrder = 1, EuroAmount = 100, Description = "Order 1", new Order { IdOrder = 2, EuroAmount = 150, Description = "Order 2", new Order { IdOrder = 3, EuroAmount = 230, Description = "Order 3",, new Customer { Name = "Marco", City = "Torino", Orders = new Order[] { new Order { IdOrder = 4, EuroAmount = 320, Description = "Order 4", new Order { IdOrder = 5, EuroAmount = 170, Description = "Order 5", ; var ordersquery = from c in customers from o in c.orders select new { c.name, o.idorder, o.euroamount ; foreach (var item in ordersquery) { Console.WriteLine(item); Listing 2.5 Ein C# 3.0-Abfrageausdruck mit einer Verknüpfung zwischen einer Reihe von Datenquellen In Visual Basic 2008 kann eine einzelne from-klausel mehrere Datenquellen, die jeweils durch Komma getrennt werden, definieren (siehe Listing 2.6). Dim customers As Customer() = { _ New Customer With {.Name = "Paolo",.City = "Brescia", _.Orders = New Order() { _ New Order With {.IdOrder = 1,.EuroAmount = 100,.Description = "Order 1", _ New Order With {.IdOrder = 2,.EuroAmount = 150,.Description = "Order 2", _ New Order With {.IdOrder = 3,.EuroAmount = 230,.Description = "Order 3" _, _ New Customer With {.Name = "Marco",.City = "Torino", _.Orders = New Order() { _ New Order With {.IdOrder = 4,.EuroAmount = 320,.Description = "Order 4", _ New Order With {.IdOrder = 5,.EuroAmount = 170,.Description = "Order 5" _

10 32 Kapitel 2: Grundlagen der LINQ-Syntax Dim ordersquery = _ From c In customers, _ o In c.orders _ Select c.name, o.idorder, o.euroamount For Each item In ordersquery Console.WriteLine(item) Next Listing 2.6 Ein Visual Basic 2008-Abfrageausdruck mit einer Verknüpfung zwischen einer Reihe von Datenquellen Auf Verknüpfungen geht dieses Kapitel später ausführlicher ein. Die Klausel where Wie bereits erwähnt, spezifiziert die where-klausel eine Filterbedingung, die auf die Datenquelle angewendet wird. Das Prädikat wendet eine boolesche Bedingung auf jedes Element in der Datenquelle an, sodass nur diejenigen Elemente herausgezogen werden, bei denen die Auswertung der Bedingung true ergibt. In ein und derselben Abfrage können mehrere where-klauseln oder eine where-klausel mit mehreren Prädikaten erscheinen, die mit den logischen Operatoren (&&, und! in C# 3.0 bzw. And, Or, AndAlso, OrElse, Is und IsNot in Visual Basic 2008) kombiniert werden. Als Prädikat kommt in Visual Basic 2008 jeder Ausdruck infrage, der sich zu einem booleschen Wert auswerten lässt. Somit können Sie auch einen numerischen Ausdruck verwenden, der als true gilt, wenn er ungleich null ist. Die Abfrage in Listing 2.7 verwendet eine where-klausel, um alle Bestellungen mit einem EuroAmount größer als 200 Euro herauszuziehen. var ordersquery = from c in customers from o in c.orders where o.euroamount > 200 select new { c.name, o.idorder, o.euroamount ; Listing 2.7 Ein C# 3.0-Abfrageausdruck mit einer where-klausel Listing 2.8 zeigt die entsprechende Abfragesyntax in Visual Basic Dim ordersquery = _ From c In customers, _ o In c.orders _ Where o.euroamount > 200 _ Select c.name, o.idorder, o.euroamount Listing 2.8 Ein Visual Basic 2008-Abfrageausdruck mit einer where-klausel

11 Abfrageschlüsselwörter 33 Die Klausel select Die select-klausel spezifiziert die Gestalt der Abfrageausgabe. Sie basiert auf einer Projektion, die bestimmt, was aus dem Ergebnis der Auswertung aller vorangehenden Klauseln und Ausdrücke auszuwählen ist. In Visual Basic 2008 ist die Select-Klausel nicht obligatorisch. Ist sie nicht angegeben, gibt die Abfrage einen Typ zurück, der auf der für den aktuellen Gültigkeitsbereich gekennzeichneten Bereichsvariablen basiert. In den Listings 2.7 und 2.8 wurde die select-klausel verwendet, um anonyme Typen zu projizieren, die aus Eigenschaften oder Membern der Bereichsvariablen im Gültigkeitsbereich bestehen. Ein Vergleich der C# 3.0-Syntax (Listing 2.7) und der Visual Basic 2008-Syntax (Listing 2.8) zeigt, dass die Visual Basic Syntax im select-muster mehr einer SQL-Anweisung ähnelt, während die C# 3.0-Version eher die Syntax der Programmiersprache erkennen lässt. In der Tat müssen Sie in C# 3.0 explizit Ihre Absicht deklarieren, um eine neue Instanz eines anonymen Typs zu erstellen, während die Sprachsyntax in Visual Basic 2008 schlanker ist und die inneren Abläufe verbirgt. Die Klauseln group und into Mit der group-klausel können Sie ein Ergebnis projizieren, das nach einem Schlüssel gruppiert wurde. Die Klausel lässt sich als Alternative zur from-klausel einsetzen und erlaubt es, einzelne oder mehrere Schlüsselwerte zu verwenden. Listing 2.9 zeigt ein Beispiel für eine Abfrage, die Entwickler nach ihrer Programmiersprache gruppiert. Developer[] developers = new Developer[] { new Developer { Name = "Paolo", Language = "C#", new Developer { Name = "Marco", Language = "C#", new Developer { Name = "Frank", Language = "VB.NET", ; var developersgroupedbylanguage = from d in developers group d by d.language; foreach (var group in developersgroupedbylanguage) { Console.WriteLine("Language: {0", group.key); foreach (var item in group) { Console.WriteLine("\t{0", item.name); Listing 2.9 Ein C# 3.0-Abfrageausdruck, um Entwickler nach der Programmiersprache zu gruppieren Das Codefragment nach Listing 2.9 liefert die folgende Ausgabe: Language: C# Paolo Marco Language: VB.NET Frank

12 34 Kapitel 2: Grundlagen der LINQ-Syntax Wie das Codebeispiel zeigt, ist das Ergebnis der Abfrage eine Aufzählung von Gruppen, die durch einen Schlüssel identifiziert werden und aus inneren Elementen bestehen. Praktisch können Sie jede Gruppe im Ergebnis der Abfrage aufzählen, ihre Key-Eigenschaft auf der Konsole ausgeben und die Elemente in jeder Gruppe durchsuchen, um ihre Werte herauszuziehen. Wie bereits weiter oben erwähnt, können Sie Elemente nach einem Mehrfachschlüsselwert, der anonyme Typen verwendet, gruppieren. Listing 2.10 zeigt ein Beispiel, das die Entwickler nach Sprache und Alter gruppiert. Developer[] developers = new Developer[] { new Developer { Name = "Paolo", Language = "C#", Age = 32, new Developer { Name = "Marco", Language = "C#", Age = 37, new Developer { Name = "Frank", Language = "VB.NET", Age = 48, ; var developersgroupedbylanguage = from d in developers group d by new { d.language, AgeCluster = (d.age / 10) * 10 ; foreach (var group in developersgroupedbylanguage) { Console.WriteLine("Language: {0", group.key); foreach (var item in group) { Console.WriteLine("\t{0", item.name); Listing 2.10 Ein C# 3.0-Abfrageausdruck, um Entwickler nach Programmiersprache und Alter zu gruppieren Dieses Mal sieht die Ausgabe des Codefragments gemäß Listing 2.10 wie folgt aus: Language: { Language = C#, AgeCluster = 30 Paolo Marco Language: { Language = VB.NET, AgeCluster = 40 Frank In diesem Beispiel ist der Schlüssel (Key) für jede Gruppe ein anonymer Typ, der durch zwei Eigenschaften definiert wird: Language und AgeCluster. Visual Basic 2008 unterstützt auch die Gruppierung der Ergebnisse mithilfe der Group By-Klausel. Das Beispiel in Listing 2.11 zeigt eine Abfrage, die der in Listing 2.9 äquivalent ist. Dim developers As Developer() = { _ New Developer With {.Name = "Paolo",.Language = "C#",.Age = 32, _ New Developer With {.Name = "Marco",.Language = "C#",.Age = 37, _ New Developer With {.Name = "Frank",.Language = "VB.NET",.Age = 48 Dim developersgroupedbylanguage = _ From d In developers _ Group d By d.language Into Group _ Select Language, Group For Each group In developersgroupedbylanguage Console.WriteLine("Language: {0", group.language)

13 Abfrageschlüsselwörter 35 For Each item In group.group Console.WriteLine(" {0", item.name) Next Next Listing 2.11 Ein Visual Basic 2008-Abfrageausdruck, um Entwickler nach der Programmiersprache zu gruppieren Die Visual Basic 2008-Syntax ist etwas komplexer als die entsprechende C# 3.0-Syntax. In Visual Basic 2008 müssen Sie die Gruppierung mithilfe der Into-Klausel projizieren, um ein neues Group-Objekt der Elemente zu erstellen, und dann explizit das Auswahlmuster deklarieren. Allerdings lässt sich das Ergebnis der Gruppierung einfacher aufzählen, weil der Key-Wert seinen Namen (Language) beibehält. C# 3.0 bietet ebenfalls eine into-klausel, die in Verbindung mit dem Schlüsselwort group nützlich, wenn auch nicht obligatorisch ist. Das Schlüsselwort into können Sie verwenden, um die Ergebnisse einer select-, group- oder join-anweisung in einer temporären Variablen zu speichern. Eine derartige Konstruktion bietet sich an, wenn Sie zusätzliche Abfragen über den Ergebnissen ausführen müssen. Aufgrund dieses Verhaltens bezeichnet man das Schlüsselwort auch als Fortsetzungsklausel. Listing 2.12 zeigt ein Beispiel für einen C# 3.0-Abfrageausdruck, der die into-klausel verwendet. var developersgroupedbylanguage = from d in developers group d by d.language into developersgrouped select new { Language = developersgrouped.key, DevelopersCount = developersgrouped.count() ; foreach (var group in developersgroupedbylanguage) { Console.WriteLine ("Language {0 contains {1 developers", group.language, group.developerscount); Listing 2.12 Ein C# 3.0-Abfrageausdruck, der die into-klausel verwendet Die Klausel orderby Wie der Name vermuten lässt, dient die orderby-klausel dazu, das Ergebnis einer Abfrage in auf- oder absteigender Reihenfolge zu sortieren. Die Sortierung lässt sich mit einem oder mehreren Schlüsseln durchführen, die verschiedene Sortierrichtungen kombinieren. Listing 2.13 zeigt ein Beispiel für eine Abfrage, um die von Kunden aufgegebenen Bestellungen herauszuziehen und nach EuroAmount zu sortieren. var orderssortedbyeuroamount = from c in customers from o in c.orders orderby o.euroamount select new { c.name, o.idorder, o.euroamount ; Listing 2.13 Ein C# 3.0-Abfrageausdruck mit einer orderby-klausel

14 36 Kapitel 2: Grundlagen der LINQ-Syntax Die Beispielabfrage in Listing 2.14 wählt Bestellungen sortiert nach Kundenname (Name) und EuroAmount in absteigender Reihenfolge aus. var orderssortedbycustomerandeuroamount = from c in customers from o in c.orders orderby c.name, o.euroamount descending select new { c.name, o.idorder, o.euroamount ; Listing 2.14 Ein C# 3.0-Abfrageausdruck, der eine orderby-klausel mit mehreren Sortierbedingungen verwendet Listing 2.15 zeigt die entsprechende Abfrage als Visual Basic 2008-Version. Dim orderssortedbycustomerandeuroamount = _ From c In customers, _ o In c.orders _ Order By c.name, o.euroamount Descending _ Select c.name, o.idorder, o.euroamount Listing 2.15 Ein Visual Basic 2008-Abfrageausdruck, der eine orderby-klausel mit mehreren Sortierbedingungen verwendet Hier weisen beide Sprachen eine sehr ähnliche Syntax auf. Die Klausel join Mit dem Schlüsselwort join können Sie unterschiedliche Datenquellen verbinden, und zwar auf der Basis eines Members, der sich auf Gleichheit prüfen lässt. Die Klausel funktioniert ähnlich wie eine SQL- Gleichheitsverknüpfung. Es ist allerdings nicht möglich, die zu verknüpfenden Elemente mit Vergleichsoperatoren der Art größer als, kleiner als oder ungleich zu vergleichen. Die Gleichheitstests definieren Sie mit einem speziellen Schlüsselwort equals, das ein anderes Verhalten als der Operator == zeigt, weil die Position der Operanden eine Rolle spielt. Bei equals verwendet der linke Schlüssel die äußere Quellsequenz und der rechte Schlüssel die innere Quelle. Der Gültigkeitsbereich der äußeren Quelle beschränkt sich auf die linke Seite von equals und die innere Quellsequenz ist nur auf der rechten Seite gültig. In Pseudocode sieht dieses Konzept wie folgt aus: join-clause ::= join inneritem in innersequence on outerkey equals innerkey Mithilfe der join-klausel können Sie innere Verknüpfungen, Gruppenverknüpfungen und linke äußere Verknüpfungen definieren. Eine innere Verknüpfung gibt eine lineare Ergebniszuordnung der äußeren Datenquellenelemente zur entsprechenden inneren Datenquelle zurück. Dabei werden die äußeren Datenquellenelemente, die keine Entsprechung bei den inneren Datenquellenelementen haben, übersprungen. Listing 2.16 gibt eine einfache Abfrage mit einer inneren Verknüpfung zwischen Artikelkategorien und dazu gehörenden Produkten an. public class Category { public Int32 IdCategory { get; set; public String Name { get; set;

15 Abfrageschlüsselwörter 37 public class Product { public String IdProduct { get; set; public Int32 IdCategory { get; set; public String Description { get; set; //... Code weggelassen... Category[] categories = new Category[] { new Category { IdCategory = 1, Name = "Pasta", new Category { IdCategory = 2, Name = "Beverages", new Category { IdCategory = 3, Name = "Other food", ; Product[] products = new Product[] { new Product { IdProduct = "PASTA01", IdCategory = 1, Description = "Tortellini", new Product { IdProduct = "PASTA02", IdCategory = 1, Description = "Spaghetti", new Product { IdProduct = "PASTA03", IdCategory = 1, Description = "Fusilli", new Product { IdProduct = "BEV01", IdCategory = 2, Description = "Water", new Product { IdProduct = "BEV02", IdCategory = 2, Description = "Orange Juice", ; var categoriesandproducts = from c in categories join p in products on c.idcategory equals p.idcategory select new { c.idcategory, CategoryName = c.name, Product = p.description ; foreach (var item in categoriesandproducts) { Console.WriteLine(item); Listing 2.16 Ein C# 3.0-Abfrageausdruck mit einer inneren Verknüpfung Diese Ausgabe dieses Codefragments sieht etwa wie folgt aus. Beachten Sie, dass die Kategorie Other food fehlt, weil sie keine Artikel enthält. { IdCategory = 1, CategoryName = Pasta, Product = Tortellini { IdCategory = 1, CategoryName = Pasta, Product = Spaghetti { IdCategory = 1, CategoryName = Pasta, Product = Fusilli { IdCategory = 2, CategoryName = Beverages, Product = Water { IdCategory = 2, CategoryName = Beverages, Product = Orange Juice Eine Gruppenverknüpfung liefert eine hierarchische Ergebnismenge, bei der die inneren Sequenzelemente mit ihren korrespondierenden äußeren Sequenzelementen gruppiert werden. Fehlen für ein Element der äußeren Sequenz korrespondierende innere Sequenzelemente, wird das äußere Element mit einem leeren Array verknüpft. Eine Gruppenverknüpfung besitzt aufgrund ihres hierarchischen Ergebnisses keine Entsprechung in der SQL-Syntax. Listing 2.17 zeigt ein Beispiel für eine derartige Abfrage. (In Kapitel 3 lernen Sie eine erweiterte Form dieses Abfragetyps kennen.)

16 38 Kapitel 2: Grundlagen der LINQ-Syntax var categoriesandproducts = from c in categories join p in products on c.idcategory equals p.idcategory into productsbycategory select new { c.idcategory, CategoryName = c.name, Products = productsbycategory ; foreach (var category in categoriesandproducts) { Console.WriteLine("{0 - {1", category.idcategory, category.categoryname); foreach (var product in category.products) { Console.WriteLine("\t{0", product.description); Listing 2.17 Ein C# 3.0-Abfrageausdruck mit einer Gruppenverknüpfung Dieses Mal ist die Kategorie Other food in der Ausgabe vorhanden, auch wenn sie leer ist: 1 Pasta Tortellini Spaghetti Fusilli 2 Beverages Water Orange Juice 3 - Other food In Visual Basic 2008 steht das spezielle Schlüsselwort Group Join zur Verfügung, um Gruppenverbindungen in Abfrageausdrücken zu definieren. Eine linke äußere Verknüpfung liefert eine lineare Ergebnismenge, die alle äußeren Quellelemente umfasst, selbst wenn das entsprechende innere Quellelement fehlt. Um dieses Ergebnis zu erzeugen, brauchen Sie die Erweiterungsmethode DefaultIfEmpty, die einen Standardwert zurückgibt, falls ein Datenquellenwert leer ist. Auf diese und viele andere Erweiterungsmethoden geht Kapitel 3 näher ein. Listing 2.18 zeigt ein Beispiel für diese Syntax. var categoriesandproducts = from c in categories join p in products on c.idcategory equals p.idcategory into productsbycategory from pc in productsbycategory.defaultifempty( new Product { IdProduct = String.Empty, Description = String.Empty, IdCategory = 0) select new { c.idcategory, CategoryName = c.name, Product = pc.description ;

17 Abfrageschlüsselwörter 39 foreach (var item in categoriesandproducts) { Console.WriteLine(item); Listing 2.18 Ein C# 3.0-Abfrageausdruck mit einer linken äußeren Verknüpfung Dieses Beispiel erzeugt die folgende Ausgabe auf der Konsole: { IdCategory = 1, CategoryName = Pasta, Product = Tortellini { IdCategory = 1, CategoryName = Pasta, Product = Spaghetti { IdCategory = 1, CategoryName = Pasta, Product = Fusilli { IdCategory = 2, CategoryName = Beverages, Product = Water { IdCategory = 2, CategoryName = Beverages, Product = Orange Juice { IdCategory = 3, CategoryName = Other food, Product = Die Kategorie Other food ist mit einem leeren Artikel vertreten. Diesen Wert stellt die Erweiterungsmethode DefaultIfEmpty bereit. Schließlich sei zur join-klausel erwähnt, dass Sie Elemente mithilfe von zusammengesetzten Schlüsseln vergleichen können. Verwenden Sie einfach anonyme Typen, wie es für das Schlüsselwort group gezeigt wurde. Wenn zum Beispiel ein zusammengesetzter Schlüssel in Category aus IdCategory und Year besteht, können Sie die folgende Anweisung schreiben, wobei in der equals-bedingung ein anonymer Typ verwendet wird. from c in categories join p in products on new { c.idcategory, c.year equals new { p.idcategory, p.year into productsbycategory Wie Sie in diesem Kapitel bereits gesehen haben, können Sie die Ergebnisse von Verknüpfungen auch mit verschachtelten from-klauseln erhalten. Dieser Ansatz bietet sich an, wenn Sie Abfragen mit Nicht- Gleichheitsverknüpfungen (Non-Equijoins) definieren müssen. Die Syntax von Visual Basic 2008 ähnelt der von C# 3.0, bietet aber auch einige Shortcuts, um Verknüpfungen schneller zu definieren. Es lassen sich implizite Verknüpfungsanweisungen definieren, indem mehrere In-Klauseln in der From-Anweisung verwendet und Gleichheitsbedingungen mit einer Where-Klausel definiert werden. Ein Beispiel für diese Syntax ist in Listing 2.19 zu sehen. Dim categoriesandproducts = _ From c In categories, p In products _ Where c.idcategory = p.idcategory _ Select c.idcategory, CategoryName = c.name, Product = p.description For Each item In categoriesandproducts Console.WriteLine(item) Next Listing 2.19 Eine implizite Verknüpfungsanweisung in Visual Basic 2008

18 40 Kapitel 2: Grundlagen der LINQ-Syntax Listing 2.20 zeigt die gleiche Abfrage, die hier aber mit der normalen expliziten join-syntax formuliert ist. Dim categoriesandproducts = _ From c In categories Join p In products _ On p.idcategory Equals c.idcategory _ Select c.idcategory, CategoryName = c.name, Product = p.description Listing 2.20 Eine explizite Verknüpfungsanweisung in Visual Basic 2008 Beachten Sie, dass in Visual Basic 2008 die Reihenfolge der Elemente im Gleichheitstest keine Rolle spielt, weil der Compiler sie in eigener Regie anordnet. Dadurch ist die Abfragesyntax etwas»entspannter«als sie vom herkömmlichen relationalen SQL bekannt ist. Die Klausel let Mit der let-klausel ist es möglich, das Ergebnis eines Unterausdrucks in einer Variablen zu speichern, die sich dann an anderer Stelle in der Abfrage verwenden lässt. Diese Klausel ist nützlich, wenn Sie den gleichen Ausdruck mehrmals in derselben Abfrage verwenden müssen und ihn nicht jedes Mal neu definieren möchten. Mit der let-klausel definieren Sie für diesen Ausdruck eine Bereichsvariable und verweisen darauf innerhalb der Abfrage. Nachdem Sie die in der let-klausel definierte Bereichsvariable zugewiesen haben, können Sie sie nicht mehr ändern. Wenn jedoch die Bereichsvariable einen abfragbaren Typ speichert, kann sie abgefragt werden. Das Beispiel in Listing 2.21 wendet diese Klausel an, um dieselben Artikelkategorien mit der Anzahl ihrer Artikel auszuwählen und nach der Anzahl selbst zu sortieren. var categoriesbyproductsnumberquery = from c in categories join p in products on c.idcategory equals p.idcategory into productsbycategory let ProductsCount = productsbycategory.count() orderby ProductsCount select new { c.idcategory, ProductsCount; foreach (var item in categoriesbyproductsnumberquery) { Console.WriteLine(item); Listing 2.21 Beispiel in C# 3.0 für die let-klausel Die Ausgabe des obigen Codefragments sieht wie folgt aus: { IdCategory = 3, ProductsCount = 0 { IdCategory = 2, ProductsCount = 2 { IdCategory = 1, ProductsCount = 3 Visual Basic 2008 verwendet eine ähnliche Syntax wie C# 3.0 und erlaubt es ebenfalls, mehrere durch Komma getrennte Aliasnamen innerhalb derselben let-klausel zu definieren.

19 Verzögerte Auswertung von Abfragen und Auflösung von Erweiterungsmethoden 41 Zusätzliche Schlüsselwörter in Visual Basic 2008 Visual Basic 2008 umfasst zusätzliche Schlüsselwörter für Abfrageausdrücke, die in C# 3.0 nur über Erweiterungsmethoden verfügbar sind. Die folgende Liste beschreibt diese Schlüsselwörter: Aggregate wendet eine Aggregatfunktion auf eine Datenquelle an. Mit diesem Schlüsselwort können Sie statt mit einer From-Klausel eine neue Abfrage beginnen. Distinct beseitigt doppelte Werte in Abfrageergebnissen. Skip überspringt die ersten n Elemente eines Abfrageergebnisses. Skip While überspringt von einem Abfrageergebnis die ersten Elemente, die einem angegebenen Prädikat entsprechen. Take nimmt die ersten n Elemente eines Abfrageergebnisses. Take While nimmt von einem Abfrageergebnis die ersten Elemente, die einem angegebenen Prädikat entsprechen. Die Schlüsselwörter Skip und Take bzw. Skip While und Take While können zusammen verwendet werden, um die Abfrageergebnisse zu paginieren. Kapitel 3 zeigt einige Beispiele zu diesem Thema. Mehr zur Abfragesyntax Mittlerweile kennen Sie alle Abfrageschlüsselwörter, die über die Programmiersprachen verfügbar sind. Denken Sie dabei daran, dass jeder Abfrageausdruck vom Sprachcompiler in einen Aufruf der entsprechenden Erweiterungsmethoden konvertiert wird. Wenn Sie eine Datenquelle mithilfe von LINQ abfragen möchten und für eine bestimmte Operation in einem Abfrageausdruck kein Schlüsselwort vorhanden ist, können Sie native oder benutzerdefinierte Erweiterungsmethoden in Verbindung mit der Abfrageausdruckssyntax direkt aufrufen. Falls Sie ausschließlich Erweiterungsmethoden verwenden (wie es in Listing 2.3 zu sehen ist), spricht man von Methodensyntax. Wird die Abfragesyntax in Verbindung mit Erweiterungsmethoden eingesetzt (wie in Listing 2.17 gezeigt), bezeichnet man das Ergebnis als gemischte Abfragesyntax. Verzögerte Auswertung von Abfragen und Auflösung von Erweiterungsmethoden In diesem Abschnitt geht es um zwei Verhaltensweisen eines Abfrageausdrucks: verzögerte Abfrageauswertung und Auflösung von Erweiterungsmethoden. Beide Konzepte sind für alle LINQ-Implementierungen wichtig. Verzögerte Abfrageauswertung Ein Abfrageausdruck wird nicht ausgewertet, wenn er definiert wird, sondern erst, wenn er verwendet wird. Sehen Sie sich dazu das Beispiel in Listing 2.22 an.

20 42 Kapitel 2: Grundlagen der LINQ-Syntax List<Developer> developers = new List<Developer>(new Developer[] { new Developer { Name = "Paolo", Language = "C#", Age = 32, new Developer { Name = "Marco", Language = "C#", Age = 37, new Developer { Name = "Frank", Language = "VB.NET", Age = 48, ); var query = from d in developers where d.language == "C#" select new { d.name, d.age ; Console.WriteLine("There are {0 C# developers.", query.count()); Listing 2.22 Beispiel für eine LINQ-Abfrage über einer Gruppe von Entwicklern Dieser Code deklariert eine sehr einfache Abfrage, die lediglich zwei Elemente enthält. Das können Sie am Code ablesen, der die Liste der Entwickler deklariert, oder anhand der Konsolenausgabe des Codes, der die Erweiterungsmethode Count aufruft: There are 2 C# developers. Nehmen Sie nun an, dass Sie den Inhalt der Quellsequenz ändern möchten, indem Sie eine neue Developer- Instanz hinzufügen nachdem die Variable query definiert worden ist (siehe Listing 2.23). developers.add(new Developer { Name = "Roberto", Language = "C#", Age = 35 ); Console.WriteLine("There are {0 C# developers.", query.count()); Listing 2.23 Beispielcode, um die Gruppe der abzufragenden Entwickler zu ändern Wenn Sie die Variable query erneut aufzählen oder einfach ihre Elementanzahl überprüfen, wie es in Listing 2.23 geschieht, nachdem ein neuer Entwickler hinzugefügt wurde, erhalten Sie als Ergebnis drei Elemente. Der neue Entwickler ist jetzt im Ergebnis enthalten, obwohl er erst nach der Definition von query hinzugefügt wurde. Dieses Verhalten ist darin begründet, dass ein Abfrageausdruck vom logischen Standpunkt her eine Art von»abfrageplan«beschreibt. Ausgeführt wird er erst, wenn er verwendet wird, und er wird immer wieder ausgeführt, wenn Sie ihn aufrufen. Manche LINQ-Implementierungen wie zum Beispiel LINQ to Objects implementieren dieses Verhalten über Delegaten. Andere Implementierungen wie zum Beispiel LINQ to SQL verwenden Ausdrucksbaumstrukturen, die sich auf die Schnittstelle IQueryable<T> stützen. Diese so genannte verzögerte Abfrageauswertung ist ein fundamentales Konzept in LINQ, und zwar unabhängig von der verwendeten LINQ-Implementierung. Verzögerte Abfrageauswertung ist nützlich, weil Sie Abfragen einmalig definieren und mehrmals anwenden können: Wenn sich die Quellsequenz geändert hat, wird das Ergebnis immer mit dem neuesten Inhalt aktualisiert. Betrachten Sie aber eine Situation, in der Sie einen Snapshot des Ergebnisses zu einem bestimmten Sicherungspunkt erstellen möchten, um es mehrmals zu verwenden und die erneute Ausführung aus Performancegründen zu vermeiden, oder um unabhängig von Änderungen an der Quellsequenz zu sein. In diesem Fall müssen Sie eine Kopie des Ergebnisses erstellen. Dazu können Sie einen Satz so genann-

Paolo Pialorsi, Marco Russo. Datenbankprogrammierung. mit Microsoft LINQ. Microsoft

Paolo Pialorsi, Marco Russo. Datenbankprogrammierung. mit Microsoft LINQ. Microsoft Paolo Pialorsi, Marco Russo Datenbankprogrammierung mit Microsoft LINQ Microsoft Inhaltsverzeichnis Vorwort Einleitung Danksagung XV XVII XVIII Einführung Über dieses Buch Systemanforderungen Die Companion-Website

Mehr

LINQ & Streams. Arthur Zaczek

LINQ & Streams. Arthur Zaczek LINQ & Streams Arthur Zaczek Apr 2015 1 C# LINQ 1.1 LINQ Language Integrated Query Abfragen gegen beliebige Datenquellen möglich Listen von Objekten Datenbanken (Linq2SQL, Entity Framework, nhibernate)

Mehr

LINQ to SQL. Proseminar Objektorientiertes Programmieren mit.net und C# Christoph Knüttel. Institut für Informatik Software & Systems Engineering

LINQ to SQL. Proseminar Objektorientiertes Programmieren mit.net und C# Christoph Knüttel. Institut für Informatik Software & Systems Engineering LINQ to SQL Proseminar Objektorientiertes Programmieren mit.net und C# Christoph Knüttel Institut für Informatik Software & Systems Engineering Agenda 1. LINQ allgemein Vorteile Bausteine und Varianten

Mehr

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Übung 1 mit C# 6.0 MATTHIAS RONCORONI Übung 1 mit C# 6.0 MATTHIAS RONCORONI Inhalt 2 1. Überblick über C# 2. Lösung der Übung 1 3. Code 4. Demo C# allgemein 3 aktuell: C# 6.0 mit.net-framework 4.6: Multiparadigmatisch (Strukturiert, Objektorientiert,

Mehr

Eine völlig andere Form Abfragen zu erstellen ist, sie mit Hilfe der Datenbankabfragesprache SQL zu gestalten.

Eine völlig andere Form Abfragen zu erstellen ist, sie mit Hilfe der Datenbankabfragesprache SQL zu gestalten. Einführung SQL 2010 Niko Becker Mit unseren Übungen zu ACCESS können Sie Aufbau und Struktur einer relationalen Datenbank kennenlernen. Wir zeigen Ihnen wie Sie Tabellen, Formulare und Berichte erstellen

Mehr

Teil A Einführung in Microsoft Visual C# und Microsoft Visual Studio 2008 23

Teil A Einführung in Microsoft Visual C# und Microsoft Visual Studio 2008 23 Einleitung 13 Einführung 13 An wen sich dieses Buch richtet 13 Wegweiser für Ein- und Umsteiger 14 Konventionen und Features in diesem Buch 15 Konventionen 15 Weitere Features 16 Systemvoraussetzungen

Mehr

Microsoft Visual C# 2008

Microsoft Visual C# 2008 John Sharp 13 Microsoft Visual C# 2008 Schritt für Schritt 13 13 14 15 15 16 16 17 17 17 21 22 22 23 25 26 II 40 51 Press 53 54 54 55 55 56 56 57 58 63 63 64 Inhaltsverzeichnis Einleitung 13 Einführung

Mehr

.NET und Language Integrated Query (LINQ) W3L AG info@w3l.de

.NET und Language Integrated Query (LINQ) W3L AG info@w3l.de 1.NET und Language Integrated Query (LINQ) W3L AG info@w3l.de 2012 2 Inhaltsverzeichnis LINQ to Objects Vergleich mit Schleifen Abfrage-Syntax Erweiterungsmethoden-Syntax LINQ Abfrage Bestandteile Spracherweiterungen

Mehr

LINQ. LANGUAGE INTEGREATED QUERY.net 3.5. Bernhard Grojer BernhardG@ppedv.de

LINQ. LANGUAGE INTEGREATED QUERY.net 3.5. Bernhard Grojer BernhardG@ppedv.de LINQ LANGUAGE INTEGREATED QUERY.net 3.5 Bernhard Grojer BernhardG@ppedv.de Agenda Übersicht LINQ Basistechnologien Verschiedene Arten von LINQ LINQ (to Objects) LINQ TO SQL Übersicht LINQ Aggregationen

Mehr

Jürgen Bayer. Anonyme Methoden, Lambda-Ausdrücke und Ausdrucksbäume in.net

Jürgen Bayer. Anonyme Methoden, Lambda-Ausdrücke und Ausdrucksbäume in.net Jürgen Bayer Anonyme Methoden, Lambda-Ausdrücke und Ausdrucksbäume in.net Inhaltsverzeichnis 1 Einleitung 1 2 Anonyme Methoden 2 3 Lambda-Ausdrücke 4 4 Ausdrucksbäume 6 4.1 Was sind Ausdrucksbäume? 6 4.2

Mehr

Spracherweiterungen von C# 3.5

Spracherweiterungen von C# 3.5 Microsoft Press Seitenanzahl 13 45 Spracherweiterungen von C# 3.5 Lokale Typinferenz 1213 Erweiterungsmethoden 1214 Objektinitialisierer 1216 Anonymer Typ 1217 Lambda-Ausdrücke 1218 Die Spracherweiterungen

Mehr

Inhaltsverzeichnis. jetzt lerne ich

Inhaltsverzeichnis. jetzt lerne ich Inhaltsverzeichnis jetzt lerne ich Einführung 15 1 Erste Schritte 21 1.1 Datenbanken und Datenbank-Managementsysteme 21 1.2 Zugriff auf Datenbanken 22 1.3 Was der Großvater noch wusste... 22 1.4 Einordnung

Mehr

Ich liebe Java && Ich liebe C# Rolf Borst

Ich liebe Java && Ich liebe C# Rolf Borst Ich liebe Java && Ich liebe C# Rolf Borst Java oder C#? Einführung public class Einfuehrung { private int gesamtzahl = 0; /* Ermittelt die Anzahl der geraden und durch drei teilbaren Zahlen */ public String

Mehr

3. Auflage. O Reillys Taschenbibliothek. C# 5.0 kurz & gut. Joseph Albahari & Ben Albahari O REILLY. Aktualisierung von Lars Schulten

3. Auflage. O Reillys Taschenbibliothek. C# 5.0 kurz & gut. Joseph Albahari & Ben Albahari O REILLY. Aktualisierung von Lars Schulten O Reillys Taschenbibliothek 3. Auflage C# 5.0 kurz & gut O REILLY Joseph Albahari & Ben Albahari Aktualisierung von Lars Schulten Inhalt C# 5.0 kurz & gut... 1 Ein erstes C#-Programm... 2 Syntax... 5 Typgrundlagen...

Mehr

Entwicklung der Programmiersprache C#

Entwicklung der Programmiersprache C# Language Day HDM 2015 Entwicklung der Programmiersprache C# Referent: Mikhail Orleanskiy, IT-Designers GmbH (orleanskiy@it-designers.de) Stand: 6. November 2015 Eine Präsentation der IT-Designers Gruppe

Mehr

5.4 Klassen und Objekte

5.4 Klassen und Objekte 5.4 Klassen und Objekte Zusammenfassung: Projekt Figuren und Zeichner Figuren stellt Basisklassen für geometrische Figuren zur Verfügung Zeichner bietet eine übergeordnete Klasse Zeichner, welche die Dienstleistungen

Mehr

Details zu den Ausdrücken nach FROM, WHERE, GROUP BY und HAVING finden Sie in den Abschnitten über JOIN, WHERE und GROUP BY.

Details zu den Ausdrücken nach FROM, WHERE, GROUP BY und HAVING finden Sie in den Abschnitten über JOIN, WHERE und GROUP BY. SELECT - Der Grundbefehl zur Auswahl von Daten Die SELECT-Anweisung fragt Daten aus einer Datenbank ab und stellt diese in einer virtuellen Tabelle zur Verfügung. Diese virtuelle Tabelle, eine Menge von

Mehr

Studentische Lösung zum Übungsblatt Nr. 7

Studentische Lösung zum Übungsblatt Nr. 7 Studentische Lösung zum Übungsblatt Nr. 7 Aufgabe 1) Dynamische Warteschlange public class UltimateOrderQueue private Order[] inhalt; private int hinten; // zeigt auf erstes freies Element private int

Mehr

Vererbung & Schnittstellen in C#

Vererbung & Schnittstellen in C# Vererbung & Schnittstellen in C# Inhaltsübersicht - Vorüberlegung - Vererbung - Schnittstellenklassen - Zusammenfassung 1 Vorüberlegung Wozu benötigt man Vererbung überhaubt? 1.Um Zeit zu sparen! Verwendung

Mehr

Einführung in SQL. Sprachumfang: Indizes. Datensätzen. Zugriffsrechten

Einführung in SQL. Sprachumfang: Indizes. Datensätzen. Zugriffsrechten Einführung in SQL Die Sprache SQL (Structured Query Language) ist eine Programmiersprache für relationale Datenbanksysteme, die auf dem ANSI-SQL-Standard beruht. SQL wird heute von fast jedem Datenbanksystem

Mehr

Probeklausur: Programmierung WS04/05

Probeklausur: Programmierung WS04/05 Probeklausur: Programmierung WS04/05 Name: Hinweise zur Bearbeitung Nimm Dir für diese Klausur ausreichend Zeit, und sorge dafür, dass Du nicht gestört wirst. Die Klausur ist für 90 Minuten angesetzt,

Mehr

SQL. strukturierte Datenbankabfragesprache eine Datenbanksprache zur. Structured Query Language:

SQL. strukturierte Datenbankabfragesprache eine Datenbanksprache zur. Structured Query Language: SQL Structured Query Language: strukturierte Datenbankabfragesprache eine Datenbanksprache zur Definition, Abfrage und Manipulation von Daten in relationalen Datenbanken In der SQL-Ansicht arbeiten In

Mehr

Neue Features in C# 2.0

Neue Features in C# 2.0 Neue Features in C# 2.0 (gekürzt) Generische Typen Iteratoren Vereinfachte Delegate-Erzeugung Anonyme Methoden Partielle Klassen Sonstiges University of Linz, Institute for System Software, 2004 published

Mehr

Besonderheiten von C#

Besonderheiten von C# Besonderheiten von C# Wert- und Referenztypen int a, b; a = 3; b = a; a++; Debug.Assert( a==4 && b==3 &&!a.equals(b), "int ist doch kein Werttyp" ); RTyp ra, rb; ra = new RTyp(3); rb = ra; ra.inc(); Debug.Assert(

Mehr

Integration Services - Dienstarchitektur

Integration Services - Dienstarchitektur Integration Services - Dienstarchitektur Integration Services - Dienstarchitektur Dieser Artikel solle dabei unterstützen, Integration Services in Microsoft SQL Server be sser zu verstehen und damit die

Mehr

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = 0.51129 Euro ergeben.

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = 0.51129 Euro ergeben. Aufgabe 1.30 : Schreibe ein Programm DM_in_Euro.java zur Umrechnung eines DM-Betrags in Euro unter Verwendung einer Konstanten für den Umrechnungsfaktor. Das Programm soll den DM-Betrag als Parameter verarbeiten.

Mehr

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2 Java Einführung VARIABLEN und DATENTYPEN Kapitel 2 Inhalt dieser Einheit Variablen (Sinn und Aufgabe) Bezeichner Datentypen, Deklaration und Operationen Typenumwandlung (implizit/explizit) 2 Variablen

Mehr

Die Java Stream API. Funktionale Programmierung mit der Stream API des JDK 1.8. Prof. Dr. Nikolaus Wulff

Die Java Stream API. Funktionale Programmierung mit der Stream API des JDK 1.8. Prof. Dr. Nikolaus Wulff Die Java Stream API Funktionale Programmierung mit der Stream API des JDK 1.8 Prof. Dr. Nikolaus Wulff Funktionale Programmierung Neben der Collection API mit default Methoden ist als weitere Neuerung

Mehr

Microsoft SQL Server 2000 Programmierung

Microsoft SQL Server 2000 Programmierung Rebecca M. Riordan Microsoft SQL Server 2000 Programmierung Schritt für Schritt Microsoft Press Einführung Ihr Ausgangspunkt Neue Features in SQL Server 2000 Verwenden der beiliegenden CD-ROM Systemanforderungen

Mehr

Tutorial: Eigene Module und Extensions entwickeln. Version: 0.1 Autor: Anja Beuth

Tutorial: Eigene Module und Extensions entwickeln. Version: 0.1 Autor: Anja Beuth Tutorial: Eigene Module und Extensions entwickeln Version: 0.1 Autor: Anja Beuth Inhaltsverzeichnis 1 2 2.1 2.2 2.3 2.4 3 4 4.1 4.2 4.3 5 5.1 6 6.1 6.2 Notwendigkeit prüfen... Ein Projekt in Visual Studio

Mehr

Oracle: Abstrakte Datentypen:

Oracle: Abstrakte Datentypen: Oracle: Abstrakte Datentypen: Oracle bietet zwei mögliche Arten um abstrakte Datentypen zu implementieren: Varying Array Nested Table Varying Array (kunde) kdnr kdname gekaufteart 1 Mustermann 1 4 5 8

Mehr

Vielen Dank an Dennis Riehle für die Bereitstellung dieser Folien

Vielen Dank an Dennis Riehle für die Bereitstellung dieser Folien Vielen Dank an Dennis Riehle für die Bereitstellung dieser Folien 1.1 Definition Datenbank Ein Datenbanksystem (DBS) ist ein System zur elektronischen Datenverwaltung. Die wesentliche Aufgabe eines DBS

Mehr

27 Transact-SQL-Erweiterungen in Bezug auf Analysis Services

27 Transact-SQL-Erweiterungen in Bezug auf Analysis Services 531 27 Transact-SQL-Erweiterungen in Bezug auf Analysis Services Im zweiten Teil dieses Buches haben wir die Eigenschaften der Transact-SQL- Sprache in Bezug auf die Bearbeitung von operativen Daten gezeigt.

Mehr

Objektorientierte Programmierung

Objektorientierte Programmierung Objektorientierte Programmierung 1 Geschichte Dahl, Nygaard: Simula 67 (Algol 60 + Objektorientierung) Kay et al.: Smalltalk (erste rein-objektorientierte Sprache) Object Pascal, Objective C, C++ (wiederum

Mehr

Inhaltsverzeichnis. Einleitung... 13

Inhaltsverzeichnis. Einleitung... 13 Inhaltsverzeichnis Einleitung...................................................... 13 Einführung 13 Wegweiser für Ein- und Umsteiger..................................... 13 Konventionen und Features in

Mehr

Spec# Einführung. Formale Software-Entwicklung Seminar SS 07 Universität Karlsruhe Hilal Akbaba

Spec# Einführung. Formale Software-Entwicklung Seminar SS 07 Universität Karlsruhe Hilal Akbaba Spec# Einführung Formale Software-Entwicklung Seminar SS 07 Universität Karlsruhe Hilal Akbaba Inhalt Einführung in C# Das Spec# System Die Konstrukte Vererben der Verträge System Architektur Einführung

Mehr

Javakurs zu Informatik I. Henning Heitkötter

Javakurs zu Informatik I. Henning Heitkötter Javakurs zu Informatik I Arrays vergleichen Implementieren Sie folgende Methode, die prüft, ob die Elemente der beiden Arrays an jeder Position übereinstimmen: public static boolean identisch(int[] a,

Mehr

13 OOP MIT DELPHI. Records und Klassen Ein Vergleich

13 OOP MIT DELPHI. Records und Klassen Ein Vergleich 13 OOP MIT DELPHI Delphi war früher "Object Pascal". Dieser Name impliziert eine Funktionalität, welche in der Welt der Programmierung nicht mehr wegzudenken ist: die objektorientierte Programmierung,

Mehr

Aktivitäten in C# /.NET umsetzen

Aktivitäten in C# /.NET umsetzen Aktivitäten in C# /.NET umsetzen Grundlagen von C# Dr. Beatrice Amrhein Überblick Grundlagen der C# Syntax Visual C# Express Einfache Abläufe umsetzen 2 Grundlagen von C# 3 Merkmale von C# C# besteht aus

Mehr

SQLJ. Standardisierte Java-DB. DB-Schnittstelle. Spezifikationen. Oracle, IBM, Informix, Sybase,, Tandem, Sun, Microsoft stehen dahinter

SQLJ. Standardisierte Java-DB. DB-Schnittstelle. Spezifikationen. Oracle, IBM, Informix, Sybase,, Tandem, Sun, Microsoft stehen dahinter SQLJ Standardisierte Java-DB DB-Schnittstelle Spezifikationen Part 0: Embedded SQL für Java (ANSI-Standard; Object Language Binding) Statische Einbettung von SQL-Anweisungen in Java-Quelltext Part 1: Java

Mehr

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden. Grundwissen Informatik Objekt Attribut Methoden Als Objekte bezeichnet man alle Gegenstände, Dinge, Lebewesen, Begriffe oder Strukturen unserer Welt ( Autos, Räume, Bakterien, Lehrer, Schüler, Kunden,

Mehr

8 Access-Abfragen migrieren

8 Access-Abfragen migrieren Leseprobe aus Access und SQL Server http://www.acciu.de/asqllesen 8 Access-Abfragen migrieren Mit der Migration der Tabellen Ihrer Anwendung zu einer SQL Server-Datenbank und dem Verknüpfen der SQL Server-Tabellen

Mehr

Ein anonymer-methodenausdruck definiert eine anonyme Methode und ergibt einen Wert, der auf diese Methode verweist. primärer-nicht-array-ausdruck:

Ein anonymer-methodenausdruck definiert eine anonyme Methode und ergibt einen Wert, der auf diese Methode verweist. primärer-nicht-array-ausdruck: 21 Anonyme Methoden 21.1 Ausdrücke mit anonymen Methoden Ein anonymer-methodenausdruck definiert eine anonyme Methode und ergibt einen Wert, der auf diese Methode verweist. primärer-nicht-array-ausdruck:...

Mehr

Tutorial: Eigene Module und Extensions entwickeln. version: 0.1 Author: Anja Beuth

Tutorial: Eigene Module und Extensions entwickeln. version: 0.1 Author: Anja Beuth Tutorial: Eigene Module und Extensions entwickeln version: 0.1 Author: Anja Beuth Table of contents 1 2 2.1 2.2 2.3 2.4 3 4 4.1 4.2 4.3 5 5.1 6 6.1 6.2 Notwendigkeit prüfen... Ein Projekt in Visual Studio

Mehr

Informatik 12 Datenbanken SQL-Einführung

Informatik 12 Datenbanken SQL-Einführung Informatik 12 Datenbanken SQL-Einführung Gierhardt Vorbemerkungen Bisher haben wir Datenbanken nur über einzelne Tabellen kennen gelernt. Stehen mehrere Tabellen in gewissen Beziehungen zur Beschreibung

Mehr

BTree.dll - Balancierte und verkettete Bäume. Ecofor. BTree.dll. Realisiert mit Microsoft Visual Studio 16.04.2015 1/9

BTree.dll - Balancierte und verkettete Bäume. Ecofor. BTree.dll. Realisiert mit Microsoft Visual Studio 16.04.2015 1/9 BTree.dll Realisiert mit Microsoft Visual Studio 16.04.2015 1/9 INHALT 1. Allgemein... 3 2. Class BTree1 (balanciert)... 3 3. Class BTree2 (balanciert und verkettet)... 4 4. Beschreibung BTree1 und BTree2...

Mehr

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 14/15. Kapitel 11. Fehler und Ausnahmen 1

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 14/15. Kapitel 11. Fehler und Ausnahmen 1 Kapitel 11 Fehler und Ausnahmen Fehler und Ausnahmen 1 Ziele Fehlerquellen in Programmen und bei der Programmausführung verstehen Das Java-Konzept der Ausnahmen als Objekte kennenlernen Ausnahmen auslösen

Mehr

1 Polymorphie (Vielgestaltigkeit)

1 Polymorphie (Vielgestaltigkeit) 1 Polymorphie (Vielgestaltigkeit) Problem: Unsere Datenstrukturen List, Stack und Queue können einzig und allein int-werte aufnehmen. Wollen wir String-Objekte, andere Arten von Zahlen oder andere Objekttypen

Mehr

Objektbasierte 1:n-Navigation: Ein Vergleich zwischen externer Iteration und LINQ

Objektbasierte 1:n-Navigation: Ein Vergleich zwischen externer Iteration und LINQ FernUniversität in Hagen Fakultät für Mathematik und Informatik Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann Objektbasierte 1:n-Navigation: Ein Vergleich zwischen externer Iteration und LINQ

Mehr

Einführung in VisualBasic for Applications. Stefan Mahlitz

Einführung in VisualBasic for Applications. Stefan Mahlitz Einführung in VisualBasic for Applications Stefan Mahlitz Stefan Mahlitz Einführung in VBA 27.08.00 Inhaltsverzeichnis 1. Grundlagen der VisualBasic for Applications (VBA) Programmierung...2 1.1 Variablen,

Mehr

Problemstellung. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 24: Reflection 1. IDE und automatische Tests.

Problemstellung. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 24: Reflection 1. IDE und automatische Tests. Universität Osnabrück 1 Problemstellung 3 - Objektorientierte Programmierung in Java Vorlesung 24: Reflection 1 SS 2006 Prof. Dr. Frank M. Thiesing, FH Osnabrück Um ein Objekt anzulegen, eine seiner Methoden

Mehr

Objektorientiertes Programmieren mit.net und C# Proseminar im Wintersemester 2010/2011 LINQ Verstehen und Einsetzen

Objektorientiertes Programmieren mit.net und C# Proseminar im Wintersemester 2010/2011 LINQ Verstehen und Einsetzen Objektorientiertes Programmieren mit.net und C# Proseminar im Wintersemester 2010/2011 LINQ Verstehen und Einsetzen Georg Wagner Technische Universität München Abstract: LINQ ist eine Sammlung von Spracherweiterungen

Mehr

Grundlagen von Python

Grundlagen von Python Einführung in Python Grundlagen von Python Felix Döring, Felix Wittwer November 17, 2015 Scriptcharakter Programmierparadigmen Imperatives Programmieren Das Scoping Problem Objektorientiertes Programmieren

Mehr

In Tabelle 2.1 sehen Sie das Ergebnis beider Ausführungen auf meiner Maschine.

In Tabelle 2.1 sehen Sie das Ergebnis beider Ausführungen auf meiner Maschine. Kapitel 2 Datenverwaltung durch SQL Server Wir wollen das obige Skript zwei Mal laufen lassen, einmal mit und einmal ohne eingeschalteten Schreibcache der Festplatte. Für eine lokale Festplatte können

Mehr

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur Unterprogramme Unterprogramme sind abgekapselte Programmfragmente, welche es erlauben, bestimmte Aufgaben in wiederverwendbarer Art umzusetzen. Man unterscheidet zwischen Unterprogrammen mit Rückgabewert

Mehr

Einführung in die Programmierung

Einführung in die Programmierung Technische Universität München WS 2003/2004 Institut für Informatik Prof. Dr. Christoph Zenger Testklausur Einführung in die Programmierung Probeklausur Java (Lösungsvorschlag) 1 Die Klasse ArrayList In

Mehr

Starthilfe für C# Inhaltsverzeichnis. Medien- und Kommunikationsinformatik (B.Sc.) Alexander Paharukov. Informatik 3 Praktikum

Starthilfe für C# Inhaltsverzeichnis. Medien- und Kommunikationsinformatik (B.Sc.) Alexander Paharukov. Informatik 3 Praktikum Starthilfe für C# Inhaltsverzeichnis Allgemeines... 2 Bezugsquellen... 2 SharpDevelop... 2.NET Runtime... 2.NET SDK... 2 Installation... 2 Reihenfolge... 2 Vorschlag für eine Ordnerstruktur... 3 Arbeit

Mehr

SQL-Befehlsliste. Vereinbarung über die Schreibweise

SQL-Befehlsliste. Vereinbarung über die Schreibweise Vereinbarung über die Schreibweise Schlüsselwort [optionale Elemente] Beschreibung Befehlsworte in SQL-Anweisungen werden in Großbuchstaben geschrieben mögliche, aber nicht zwingend erforderliche Teile

Mehr

Java Einführung Methoden in Klassen

Java Einführung Methoden in Klassen Java Einführung Methoden in Klassen Lehrziel der Einheit Methoden Signatur (=Deklaration) einer Methode Zugriff/Sichtbarkeit Rückgabewerte Parameter Aufruf von Methoden (Nachrichten) Information Hiding

Mehr

Java Kurs für Anfänger Einheit 5 Methoden

Java Kurs für Anfänger Einheit 5 Methoden Java Kurs für Anfänger Einheit 5 Methoden Ludwig-Maximilians-Universität München (Institut für Informatik: Programmierung und Softwaretechnik von Prof.Wirsing) 22. Juni 2009 Inhaltsverzeichnis Methoden

Mehr

Einführung in das Microsoft.NET-Framework. Programmiersprache C# MEF Das Managed Extensibility Framework. André Kunz

Einführung in das Microsoft.NET-Framework. Programmiersprache C# MEF Das Managed Extensibility Framework. André Kunz Einführung in das Microsoft.NET-Framework Programmiersprache C# MEF Das Managed Extensibility Framework André Kunz 21.09.2010 1 In dieser Einführung bekommen Sie einen kurzen Einstieg in das.net-framework

Mehr

Views in SQL. 2 Anlegen und Verwenden von Views 2

Views in SQL. 2 Anlegen und Verwenden von Views 2 Views in SQL Holger Jakobs bibjah@bg.bib.de, holger@jakobs.com 2010-07-15 Inhaltsverzeichnis 1 Wozu dienen Views? 1 2 Anlegen und Verwenden von Views 2 3 Schreibfähigkeit von Views 3 3.1 Views schreibfähig

Mehr

JDBC. Es kann z.b. eine ODBC-Treiberverbindung eingerichtet werden, damit das JAVA-Programm auf eine ACCESS-DB zugreifen kann.

JDBC. Es kann z.b. eine ODBC-Treiberverbindung eingerichtet werden, damit das JAVA-Programm auf eine ACCESS-DB zugreifen kann. JDBC in 5 Schritten JDBC (Java Database Connectivity) ist eine Sammlung von Klassen und Schnittstellen, mit deren Hilfe man Verbindungen zwischen Javaprogrammen und Datenbanken herstellen kann. 1 Einrichten

Mehr

Java Einführung Abstrakte Klassen und Interfaces

Java Einführung Abstrakte Klassen und Interfaces Java Einführung Abstrakte Klassen und Interfaces Interface Interface bieten in Java ist die Möglichkeit, einheitliche Schnittstelle für Klassen zu definieren, die später oder/und durch andere Programmierer

Mehr

Auszug aus. C sharp. Galileo Computing. Ein Service von. Tutorial und Referenz. von Eric Gunnerson

Auszug aus. C sharp. Galileo Computing. Ein Service von. Tutorial und Referenz. von Eric Gunnerson Auszug aus C sharp Tutorial und Referenz von Eric Gunnerson Galileo Computing 576 S., 2002, geb. 39,90 Euro, ISBN 3-89842-183-X Ein Service von Galileo Computing aus: Eric Gunnerson, C sharp - Tutorial

Mehr

Objektorientierte Programmierung. Kapitel 12: Interfaces

Objektorientierte Programmierung. Kapitel 12: Interfaces 12. Interfaces 1/14 Objektorientierte Programmierung Kapitel 12: Interfaces Stefan Brass Martin-Luther-Universität Halle-Wittenberg Wintersemester 2012/13 http://www.informatik.uni-halle.de/ brass/oop12/

Mehr

Modul 122 VBA Scribt.docx

Modul 122 VBA Scribt.docx Modul 122 VBA-Scribt 1/5 1 Entwicklungsumgebung - ALT + F11 VBA-Entwicklungsumgebung öffnen 2 Prozeduren (Sub-Prozeduren) Eine Prozedur besteht aus folgenden Bestandteilen: [Private Public] Sub subname([byval

Mehr

Probeklausur: Programmierung WS04/05

Probeklausur: Programmierung WS04/05 Probeklausur: Programmierung WS04/05 Name: Hinweise zur Bearbeitung Nimm Dir für diese Klausur ausreichend Zeit, und sorge dafür, dass Du nicht gestört wirst. Die Klausur ist für 90 Minuten angesetzt,

Mehr

Prof. W. Henrich Seite 1

Prof. W. Henrich Seite 1 Klasse - ist ein benutzerdefinierter Datentyp (Referenztyp) - hat Datenelemente - hat Methoden - Konstruktor ist spezielle Methode zum Erstellen eines Objektes vom Typ der Klasse (Instanz) - jede Klasse

Mehr

Objektorientierte Programmierung mit C++ Vector und List

Objektorientierte Programmierung mit C++ Vector und List Vector und List Ziel, Inhalt Wir lernen die Klassen vector und list aus der Standard-C++ Library kennen und anwenden. In einer Übung wenden wir diese Klassen an um einen Medienshop (CD s und Bücher) zu

Mehr

Methoden. von Objekten definiert werden, Methoden,, Zugriffsmethoden und Read-Only

Methoden. von Objekten definiert werden, Methoden,, Zugriffsmethoden und Read-Only Methoden Wie Konstruktoren und Destruktoren zum Auf- und Abbau von Objekten definiert werden, Wie inline-methoden Methoden,, Zugriffsmethoden und Read-Only Only- Methoden einzusetzen sind, Der this-pointer

Mehr

Inhaltsverzeichnis. Einleitung... 11

Inhaltsverzeichnis. Einleitung... 11 Inhaltsverzeichnis Einleitung...................................................... 11 Zu diesem Buch.................................................... 11 Was ist Visual Basic 2008?............................................

Mehr

C++ - Operatoren. Eigene Klassen mit neuen Funktionen

C++ - Operatoren. Eigene Klassen mit neuen Funktionen C++ - Operatoren Eigene Klassen mit neuen Funktionen Übersicht Klassen bisher Eigene Operatoren definieren 2 Bisher Durch Kapselung, Vererbung und Polymorphy können nun eigene Klassen definiert werden,

Mehr

Jürgen Bayer. MDI-Anwendungen in C#

Jürgen Bayer. MDI-Anwendungen in C# Jürgen Bayer MDI-Anwendungen in C# Inhaltsverzeichnis 1 Grundlagen 2 1.1 Einrichten der Formulare 2 1.2 Öffnen von MDI-Childformularen 3 2 Menüs 4 2.1 Erstellen eines Menüs 4 2.2 Programmierung der Menüpunkte

Mehr

Das Liskovsche Substitutionsprinzip

Das Liskovsche Substitutionsprinzip Kapitel 7 Das Liskovsche Substitutionsprinzip Am Ende dieses Kapitels werden Sie in der Lage sein, die folgenden Aufgaben durchzuführen: Beschreiben der Bedeutung des Liskovschen Substitutionsprinzips

Mehr

5.5.8 Öffentliche und private Eigenschaften

5.5.8 Öffentliche und private Eigenschaften 5.5.8 Öffentliche und private Eigenschaften Schnittstellen vs. Implementierungen: Schnittstelle einer Klasse beschreibt, was eine Klasse leistet und wie sie benutzt werden kann, ohne dass ihre Implementierung

Mehr

PHP Code Konventionen Um einen einheitlichen Code zu generieren, der von jedem gelesen werden kann, müssen folgende Konventionen eingehalten werden.

PHP Code Konventionen Um einen einheitlichen Code zu generieren, der von jedem gelesen werden kann, müssen folgende Konventionen eingehalten werden. PHP Code Konventionen Um einen einheitlichen Code zu generieren, der von jedem gelesen werden kann, müssen folgende Konventionen eingehalten werden. Allgemein Ein Einzug sollte aus 4 Leerzeichen bestehen.

Mehr

3 Objektorientierte Konzepte in Java

3 Objektorientierte Konzepte in Java 3 Objektorientierte Konzepte in Java 3.1 Klassendeklarationen Fragen an die Klassendeklaration: Wie heißt die Klasse? Wer darf auf die Klasse und ihre Attribute/Methoden zugreifen? Ist die Klasse eine

Mehr

Kapitel 6. Vererbung

Kapitel 6. Vererbung 1 Kapitel 6 2 Ziele Das sprinzip der objektorientierten Programmierung verstehen Und in Java umsetzen können Insbesondere folgende Begriffe verstehen und anwenden können: Ober/Unterklassen Subtyping Überschreiben

Mehr

Methoden (fortgeschritten) in C# - 1

Methoden (fortgeschritten) in C# - 1 Methoden (fortgeschritten) in C# - 1 Marc Satkowski 20. November 2016 C# Kurs Gliederung 1. Opertatoren Überladung 2. delegate 3. Anonyme Methoden delegate Lamda Ausdruck-Lamdas Anweisung-Lamdas Variablenbereich

Mehr

Microsoft.NET Framework- Programmierung mit C#

Microsoft.NET Framework- Programmierung mit C# Jeffrey Richter (Wintellect) Microsoft.NET Framework- Programmierung mit C# Zweite Ausgabe Mit einem Vorwort von Aidan Richter Microsoft Inhaltsverzeichnis Vorwort 15 Einführung 17 Die Entwicklungsplattform:

Mehr

Einführung in LINQ. Kapitel 1

Einführung in LINQ. Kapitel 1 Kapitel 1 Einführung in LINQ In diesem Kapitel: Was ist LINQ? 3 Integration in die Programmiersprache 13 LINQ-Implementationen (»Flavors«) 16 LINQ heute und morgen 18 Zusammenfassung 19 1 2 Kapitel 1:

Mehr

WIE KANN ICH ACCESS XML FÄHIGKEITEN UNABHÄNGIG VON DER VERSION BEIBRINGEN?

WIE KANN ICH ACCESS XML FÄHIGKEITEN UNABHÄNGIG VON DER VERSION BEIBRINGEN? XML 1 WIE KANN ICH ACCESS XML FÄHIGKEITEN UNABHÄNGIG VON DER VERSION BEIBRINGEN? Mit den verschiedenen Versionen von Access wurde die Unterstützung von XML immer mehr verbessert. Vollständig ist sie aber

Mehr

Die Bedeutung abstrakter Datentypen in der objektorientierten Programmierung. Klaus Kusche, September 2014

Die Bedeutung abstrakter Datentypen in der objektorientierten Programmierung. Klaus Kusche, September 2014 Die Bedeutung abstrakter Datentypen in der objektorientierten Programmierung Klaus Kusche, September 2014 Inhalt Ziel & Voraussetzungen Was sind abstrakte Datentypen? Was kann man damit grundsätzlich?

Mehr

Einführung in die. objektorientierte Programmierung

Einführung in die. objektorientierte Programmierung Einführung in die objektorientierte Programmierung Teil 3 Vererbung Modul WI111: Objektorientierte Programmierung Fachrichtung Wirtschaftsinformatik Prof. Dr. Gert Faustmann Fachbereich Berufsakademie

Mehr

4. Datenabfrage mit QBE 11

4. Datenabfrage mit QBE 11 Informationsbestände analysieren Datenabfrage mit QBE 4. Datenabfrage mit QBE 11 4.1. QBE vs. SQL Relationale Datenbanken haben schon früh den Anspruch gestellt, auch für Nicht- Informatiker nutzbar zu

Mehr

Repetitorium Informatik (Java)

Repetitorium Informatik (Java) Repetitorium Informatik (Java) Tag 6 Lehrstuhl für Informatik 2 (Programmiersysteme) Übersicht 1 Klassen und Objekte Objektorientierung Begrifflichkeiten Deklaration von Klassen Instanzmethoden/-variablen

Mehr

3.17 Zugriffskontrolle

3.17 Zugriffskontrolle 3. Der SQL-Standard 3.17. Zugriffskontrolle Seite 1 3.17 Zugriffskontrolle Datenbanken enthalten häufig vertrauliche Informationen, die nicht jedem Anwender zur Verfügung stehen dürfen. Außerdem wird man

Mehr

Dr. Monika Meiler. Inhalt

Dr. Monika Meiler. Inhalt Inhalt 5 Referenzdatentypen - Felder... 5-2 5.1 Eindimensionale Felder - Vektoren... 5-3 5.1.1 Vereinbarung... 5-3 5.1.2 Referenzen sind keine Felder... 5-4 5.1.3 Kopieren eindimensionaler Felder... 5-6

Mehr

Access [basics] Programmieren mit Arrays. Beispieldatenbank. Arrays. Eindimensionale Arrays. VBA-Grundlagen Programmieren mit Arrays

Access [basics] Programmieren mit Arrays. Beispieldatenbank. Arrays. Eindimensionale Arrays. VBA-Grundlagen Programmieren mit Arrays Dass Sie unter Access Daten in Tabellen speichern und gezielt darauf zugreifen können, wissen Sie als Access [basics]-leser schon längst. Aber was, wenn Sie nur ein paar gleichartige Daten zwischenspeichern

Mehr

VIII: Vererbung. Unterklassen einer Klasse. Vererbung von Methoden und Instanzvariablen. Überschreiben von Methoden

VIII: Vererbung. Unterklassen einer Klasse. Vererbung von Methoden und Instanzvariablen. Überschreiben von Methoden VIII: Vererbung Unterklassen einer Klasse Vererbung von Methoden und Instanzvariablen Überschreiben von Methoden Vererbung als Realisierung einer is-a Beziehung. Informatik I VIII: Vererbung 259 Beispiel:

Mehr

Data Mining-Modelle und -Algorithmen

Data Mining-Modelle und -Algorithmen Data Mining-Modelle und -Algorithmen Data Mining-Modelle und -Algorithmen Data Mining ist ein Prozess, bei dem mehrere Komponenten i n- teragieren. Sie greifen auf Datenquellen, um diese zum Training,

Mehr

Java Einführung Klassendefinitionen

Java Einführung Klassendefinitionen Java Einführung Klassendefinitionen Inhalt dieser Einheit Java-Syntax Klassen definieren Objekte instanziieren Instanzvariable deklarieren Klassenvariable deklarieren 2 Klassen definieren In der Problemanalyse

Mehr

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden Kapitel 8 Programmierkurs Birgit Engels Anna Schulze Zentrum für Angewandte Informatik Köln Objektorientierte Programmierung Methoden Überladen von Methoden Der this-zeiger Konstruktoren Vererbung WS 07/08

Mehr

Klassenbeziehungen & Vererbung

Klassenbeziehungen & Vererbung Klassenbeziehungen & Vererbung VL Objektorientierte Programmierung Raimund Kirner teilweise nach Folien von Franz Puntigam, TU Wien Überblick Arten von Klassenbeziehungen Untertypen versus Vererbung in

Mehr

Access [basics] Aktionsabfragen per VBA ausführen. Beispieldatenbank. Aktionsabfragen. Die Execute-Methode. Datenzugriff per VBA

Access [basics] Aktionsabfragen per VBA ausführen. Beispieldatenbank. Aktionsabfragen. Die Execute-Methode. Datenzugriff per VBA Aktionsabfragen lassen sich bequem mit der Entwurfsansicht für Abfragen zusammenstellen. Sie können damit Daten an Tabellen anfügen, bestehende Daten ändern oder löschen und sogar gleich die passende Tabelle

Mehr

Java Database Connectivity (JDBC) 14.07.2009 Walther Rathenau Gewerbeschule 1

Java Database Connectivity (JDBC) 14.07.2009 Walther Rathenau Gewerbeschule 1 Java Database Connectivity (JDBC) 14.07.2009 Walther Rathenau Gewerbeschule 1 Was ist JDBC? Hauptsächlich eine Sammlung von Java Klassen und Schnittstellen für eine einfache Verbindung von Java Programmen

Mehr

Einführung in Javadoc

Einführung in Javadoc Einführung in Javadoc Johannes Rinn http://java.sun.com/j2se/javadoc Was ist Javadoc? Javadoc ist ein Werkzeug, dass eine standardisierte Dokumentation für die Programmiersprache Java unterstützt. Vorteil:

Mehr

PHP 5.4 ISBN 978-3-86249-327-2. Stephan Heller, Andreas Dittfurth 1. Ausgabe, September 2012. Grundlagen zur Erstellung dynamischer Webseiten GPHP54

PHP 5.4 ISBN 978-3-86249-327-2. Stephan Heller, Andreas Dittfurth 1. Ausgabe, September 2012. Grundlagen zur Erstellung dynamischer Webseiten GPHP54 PHP 5.4 Stephan Heller, Andreas Dittfurth 1. Ausgabe, September 2012 Grundlagen zur Erstellung dynamischer Webseiten ISBN 978-3-86249-327-2 GPHP54 5 PHP 5.4 - Grundlagen zur Erstellung dynamischer Webseiten

Mehr

Javakurs 2013 Objektorientierung

Javakurs 2013 Objektorientierung Javakurs 2013 Objektorientierung Objektorientierte Programmierung I Armelle Vérité 7 März 2013 Technische Universität Berlin This work is licensed under the Creative Commons Attribution-ShareAlike 3.0

Mehr