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-

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

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

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

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

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

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

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

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

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

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

Objektorientiertes Programmieren für Ingenieure

Objektorientiertes Programmieren für Ingenieure Uwe Probst Objektorientiertes Programmieren für Ingenieure Anwendungen und Beispiele in C++ 18 2 Von C zu C++ 2.2.2 Referenzen und Funktionen Referenzen als Funktionsparameter Liefert eine Funktion einen

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

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

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

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

Variablen manipulieren per JDI

Variablen manipulieren per JDI Variablen manipulieren per JDI Zusammenfassung Jede moderne Java IDE verfügt über eine mächtige und dennoch meist einfach zu bedienende Benutzeroberfläche die das finden von Fehlern in lokalen oder entfernt

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

C++ - Einführung in die Programmiersprache Polymorphismus und Vererbung. Eltern

C++ - Einführung in die Programmiersprache Polymorphismus und Vererbung. Eltern C++ - Einführung in die Programmiersprache Polymorphismus und Vererbung Eltern Kind Kind Vererbung Definition von Klassen auf Basis von bestehenden Klassen. Implementierung von ist ein. bildet ein hierarchisches

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

Thorsten Kansy. Datenbankprogrammierung. mit.net 3.5 HANSER

Thorsten Kansy. Datenbankprogrammierung. mit.net 3.5 HANSER J Thorsten Kansy I Datenbankprogrammierung mit.net 3.5 Mehrschichtige Applikationen mit Visual Studio 2008 und MS SQL Server 2008 HANSER Inhalt 1 Vorwort und Einleitung 1 2 Neuerungen in SQL Server 2008

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

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

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

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

Structured Query Language (SQL) 1

Structured Query Language (SQL) 1 Structured Query Language (SQL) 1 1. Grundlagen und Hilfsmittel Structured Query Language, kurz SQL, wurde in den 70er Jahren bei IBM entwickelt, als eine Arbeitsgruppe die erste relationale Datenbank

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

Objective-C CheatSheet

Objective-C CheatSheet App-Templates: Erstellt automatisch einen Navigation Controller mit editierbarem UITableView und DetailView, der bei Klick auf einzelne UITableViewCell angezeigt wird. Kreiert einen GLKitViewController

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

.NET als Microsofts Entwicklerplattform

.NET als Microsofts Entwicklerplattform .NET als Microsofts Entwicklerplattform Frank Prengel Technologieberater Microsoft Deutschland http://blogs.msdn.com/frankpr Agenda Was ist.net eigentlich? Microsoft.NET heute.net Framework 2.0, 3.0.NET

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

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

Microsoft Visual Basic 2005

Microsoft Visual Basic 2005 Michael Halvorson Microsoft Visual Basic 2005 Schritt für Schritt Microsoft Inhaltsverzeichnis Zu diesem Buch 11 Was ist Visual Basic 2005? 11 Visual Basic.NET-Versionen 12 Wegweiser für Ein- und Umsteiger

Mehr

Monaden in anderen Programmiersprachen

Monaden in anderen Programmiersprachen Monaden in anderen Programmiersprachen Themen Informatik-Seminar SS 2013: Programmiersprachen und Sprachsysteme Bei: Prof. Dr. Schmidt, FH Wedel inf9500 Sebastian Philipp Überblick Motivation Monaden in

Mehr

16 SQL Server-Zugriff per VBA

16 SQL Server-Zugriff per VBA Leseprobe aus Access und SQL Server http://www.acciu.de/asqllesen 16 SQL Server-Zugriff per VBA Sie werden an verschiedenen Stellen per VBA auf die Tabellen der SQL Server-Datenbank zugreifen müssen sei

Mehr

Kapitel 3: Datenbanksysteme

Kapitel 3: Datenbanksysteme LUDWIG- MAXIMILIANS- UNIVERSITY MUNICH DEPARTMENT INSTITUTE FOR INFORMATICS Skript zur Vorlesung: Einführung in die Informatik: Systeme und Anwendungen Sommersemester 2015 Kapitel 3: Datenbanksysteme Vorlesung:

Mehr

einkonto.zahle(+100); //Transaktion Einzahlung einkonto.zahle(-20); //Transaktion Auszahlung einkonto.zahle(+30); //Transaktion Einzahlung

einkonto.zahle(+100); //Transaktion Einzahlung einkonto.zahle(-20); //Transaktion Auszahlung einkonto.zahle(+30); //Transaktion Einzahlung PIWIN I Kap. 7 Objektorientierte Programmierung - Einführung 28 Testklasse public class TestGirokonto { public static void main(string[] args) { // erzeuge neues Konto Girokonto einkonto = new Girokonto();

Mehr

UI-Testing mit Microsoft Test Manager (MTM) Philip Gossweiler / 2013-04-18

UI-Testing mit Microsoft Test Manager (MTM) Philip Gossweiler / 2013-04-18 UI-Testing mit Microsoft Test Manager (MTM) Philip Gossweiler / 2013-04-18 Software Testing Automatisiert Manuell 100% 70% 1 Überwiegender Teil der Testing Tools fokusiert auf automatisiertes Testen Microsoft

Mehr

SQL für Trolle. mag.e. Dienstag, 10.2.2009. Qt-Seminar

SQL für Trolle. mag.e. Dienstag, 10.2.2009. Qt-Seminar Qt-Seminar Dienstag, 10.2.2009 SQL ist......die Abkürzung für Structured Query Language (früher sequel für Structured English Query Language )...ein ISO und ANSI Standard (aktuell SQL:2008)...eine Befehls-

Mehr

Von der UML nach C++

Von der UML nach C++ 22 Von der UML nach C++ Dieses Kapitel behandelt die folgenden Themen: Vererbung Interfaces Assoziationen Multiplizität Aggregation Komposition Die Unified Modeling Language (UML) ist eine weit verbreitete

Mehr

Hochschule Darmstadt Fachbereich Informatik

Hochschule Darmstadt Fachbereich Informatik Hochschule Darmstadt Fachbereich Informatik WPF Routed Events, Datenbankanbindung 03.05.2010 63 Praktikum Tipp: Beispiellösungen zu P4: http://dotnet.jku.at/csbuch/solutions/ Projektvorschläge: Internet-Timeout

Mehr

PIWIN 1 Übung Blatt 5

PIWIN 1 Übung Blatt 5 Fakultät für Informatik Wintersemester 2008 André Gronemeier, LS 2, OH 14 Raum 307, andre.gronemeier@cs.uni-dortmund.de PIWIN 1 Übung Blatt 5 Ausgabedatum: 19.12.2008 Übungen: 12.1.2009-22.1.2009 Abgabe:

Mehr

SQL. SQL = Structured Query Language, ist eine standardisierte Sprache zum Gebrauch im Zusammenhang mit Datenbanken.

SQL. SQL = Structured Query Language, ist eine standardisierte Sprache zum Gebrauch im Zusammenhang mit Datenbanken. Vorlesungsteil SQL Grundlagen - 1 / 8 - SQL SQL = Structured Query Language, ist eine standardisierte Sprache zum Gebrauch im Zusammenhang mit Datenbanken. Auf einem Server (Rechner im Netz, der Dienste

Mehr

Aufbau des SELECT-Befehls. Im Folgenden werden zunächst Abfragen aus einer Tabelle vorgenommen.

Aufbau des SELECT-Befehls. Im Folgenden werden zunächst Abfragen aus einer Tabelle vorgenommen. Datenbankabfragen (Query) mit SQL (Structured Query Language) 1 Aufbau des SELECT-Befehls Im Folgenden werden zunächst Abfragen aus einer Tabelle vorgenommen. SQL-Syntax: SELECT spaltenliste FROM tabellenname

Mehr

SQL structured query language

SQL structured query language Umfangreiche Datenmengen werden üblicherweise in relationalen Datenbank-Systemen (RDBMS) gespeichert Logische Struktur der Datenbank wird mittels Entity/Realtionship-Diagrammen dargestellt structured query

Mehr

Datenbankanfragen und -operationen mittels SQL

Datenbankanfragen und -operationen mittels SQL Datenbankanfragen und -operationen mittels SQL Über den verschiedenen Tabellen einer Datenbank werden Operationen ausgeführt, die immer wieder eine Tabelle als Ergebnis zurückgeben. Mathematisch modelliert

Mehr

3. Konzepte der objektorientierten Programmierung

3. Konzepte der objektorientierten Programmierung 3. Konzepte der objektorientierten Programmierung 3.1 Basiskonzepte 3.2 Generalisierung / Spezialisierung 3.3 Aggregation 3.4 Assoziation 3.5 Nachrichten 3.6 Polymorphismus 3. Konzepte der Objektorientierung

Mehr

Einführung in die Informatik II

Einführung in die Informatik II Einführung in die Informatik II Die Structured Query Language SQL Prof. Dr. Nikolaus Wulff SQL Das E/R-Modell lässt sich eins zu eins auf ein Tabellenschema abbilden. Benötigt wird eine Syntax, um Tabellen

Mehr

Sructred Query Language

Sructred Query Language Sructred Query Language Michael Dienert 11. November 2010 Inhaltsverzeichnis 1 Ein kurzer Versionsüberblick 1 2 SQL-1 mit einigen Erweiterungen aus SQL-92 2 3 Eine Sprache zur Beschreibung anderer Sprachen

Mehr

Einführung in SQL Datenbanken bearbeiten

Einführung in SQL Datenbanken bearbeiten Einführung in SQL Datenbanken bearbeiten Jürgen Thomas Entstanden als Wiki-Buch Bibliografische Information Diese Publikation ist bei der Deutschen Nationalbibliothek registriert. Detaillierte Angaben

Mehr

C# im Vergleich zu Java

C# im Vergleich zu Java C# im Vergleich zu Java Serhad Ilgün Seminar Universität Dortmund SS 03 Gliederung Entstehung von C# und Java Überblick von C# und Java Unterschiede und Gemeinsamkeiten Zusammenfassung und Ausblick Entstehung

Mehr

Proseminar: C# und.net. 6. Vortag Generische Klassen. Sebastian Wolf

Proseminar: C# und.net. 6. Vortag Generische Klassen. Sebastian Wolf Proseminar: C# und.net 6. Vortag Generische Klassen Sebastian Wolf 1 Gliederung: 1. Einleitung 2. C# 2.0 3. Beschränkte Generizität 4. Generische Methoden 5. Überladene generische Klassen 6. Was passiert

Mehr

WHERE Klausel Generierung mit.net und Oracle. Aus unserer Projekterfahrung und Architektur-Kurs

WHERE Klausel Generierung mit.net und Oracle. Aus unserer Projekterfahrung und Architektur-Kurs Betrifft Art der Info Quelle WHERE Klausel Generierung mit.net und Oracle Technical Info Aus unserer Projekterfahrung und Architektur-Kurs Where ist the WHERE? Der Artikel untersucht die Möglichkeiten,

Mehr

Selbststudium OOP5 21.10.2011 Programmieren 1 - H1103 Felix Rohrer

Selbststudium OOP5 21.10.2011 Programmieren 1 - H1103 Felix Rohrer Kapitel 4.1 bis 4.3 1. zu bearbeitende Aufgaben: 4.1 4.1: done 2. Was verstehen Sie unter einem "Java-Package"? Erweiterungen verschiedener Klassen welche in Java benutzt werden können. 3. Sie möchten

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

Java Schulung (Java 2 Java Development Kit 5 / 6)

Java Schulung (Java 2 Java Development Kit 5 / 6) 2. Grundlagen der Objektorientierung 2.1 Klassen, Attribute, Methoden Klassen Eine Klasse beschreibt als Bauplan Gemeinsamkeiten einer Menge von Objekten ist also ein Modell, auf dessen Basis Objekte erstellt

Mehr

Bäume. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 10: Collections 4. Inhalt. Bäume. Einführung. Bäume.

Bäume. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 10: Collections 4. Inhalt. Bäume. Einführung. Bäume. Universität Osnabrück 1 Bäume 3 - Objektorientierte Programmierung in Java Vorlesung 10: Collections 4 Einführung Bäume sind verallgemeinerte Listenstrukturen Lineare Liste Jedes Element hat höchstens

Mehr

368 4 Algorithmen und Datenstrukturen

368 4 Algorithmen und Datenstrukturen Kap04.fm Seite 368 Dienstag, 7. September 2010 1:51 13 368 4 Algorithmen und Datenstrukturen Java-Klassen Die ist die Klasse Object, ein Pfeil von Klasse A nach Klasse B bedeutet Bextends A, d.h. B ist

Mehr

TCP/IP Programmierung. C# TimeServer Java6 TimeClient

TCP/IP Programmierung. C# TimeServer Java6 TimeClient TCP/IP Programmierung C# TimeServer Java6 TimeClient Stand 19.10.11 21:24:32 Seite 1 von 16 Inhaltsverzeichnis Erläuterung...3 Software...3 C#TimeServer...4 Klasse ServerThread...6 Starten und Beenden...7

Mehr

Arbeiten mit Arrays. 4.1 Eigenschaften. 4.1.1 Schlüssel und Element. Kapitel 4

Arbeiten mit Arrays. 4.1 Eigenschaften. 4.1.1 Schlüssel und Element. Kapitel 4 Arbeiten mit s Eine effiziente Programmierung mit PHP ohne seine s ist kaum vorstellbar. Diese Datenstruktur muss man verstanden haben, sonst brauchen wir mit weitergehenden Programmiertechniken wie der

Mehr

Tutorium Java Ein Überblick. Helge Janicke

Tutorium Java Ein Überblick. Helge Janicke Tutorium Java Ein Überblick Helge Janicke 26. Oktober 2000 1 VORRAUSSETZUNGEN ZUM PROGRAMMIEREN MIT JAVA. 1 1 Vorraussetzungen zum Programmieren mit Java. Was braucht man, wenn man mit Java programmieren

Mehr

Prinzipien Objektorientierter Programmierung

Prinzipien Objektorientierter Programmierung Prinzipien Objektorientierter Programmierung Valerian Wintner Inhaltsverzeichnis 1 Vorwort 1 2 Kapselung 1 3 Polymorphie 2 3.1 Dynamische Polymorphie...................... 2 3.2 Statische Polymorphie........................

Mehr

Softwarewiederverwendung und Patterns

Softwarewiederverwendung und Patterns Begrifflichkeiten und Beschreibungssystematik Begriffe Literatur zu Patterns Übersicht über die behandelten Konzepte Beschreibungsschema 97 Begriffe Glossar Patterns (Muster) sind ein Mittel der Wiederverwendung

Mehr

Interoperabilität mit Office-Anwendungen (1)

Interoperabilität mit Office-Anwendungen (1) Interoperabilität mit Office-Anwendungen (1) Durch.NET Programme (z.b. Visual Basic) können Microsoft-Office- Anwendungen automatisiert werden. Diese Technik basiert auf den s.g. Interop-Assemblys das

Mehr

C# - PROGRAMME MIT PLUGINS ERWEITERN

C# - PROGRAMME MIT PLUGINS ERWEITERN C# - PROGRAMME MIT PLUGINS ERWEITERN Schreibt man ein Programm welches erweiterbar sein soll, dann gibt es häufig mehrere Möglichkeiten dies umzusetzen. Die Objektorientierung ist dabei der erste Schritt,

Mehr

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {... PIWIN I Kap. 8 Objektorientierte Programmierung - Vererbung 31 Schlüsselwort: final Verhindert, dass eine Methode überschrieben wird public final int holekontostand() {... Erben von einer Klasse verbieten:

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

Inhaltsverzeichnis .NET 3.5. WPF, WCF, LINQ, C# 2008, VB 2008 und ASP.NET AJAX. Herausgegeben von Holger Schwichtenberg ISBN: 978-3-446-41045-9

Inhaltsverzeichnis .NET 3.5. WPF, WCF, LINQ, C# 2008, VB 2008 und ASP.NET AJAX. Herausgegeben von Holger Schwichtenberg ISBN: 978-3-446-41045-9 sverzeichnis Walter Doberenz, Matthias Fischer, Jana Frank, Thomas Gewinnus, Jörg Krause, Patrick A. Lorenz, Jörg Neumann, Holger Schwichtenberg.NET 3.5 WPF, WCF, LINQ, C# 2008, VB 2008 und ASP.NET AJAX

Mehr

Meeting C++ C++11 R-Value Referenzen

Meeting C++ C++11 R-Value Referenzen Meeting C++ Detlef Wilkening http://www.wilkening-online.de 09.11.2012 Inhalt Motivation L-Values und R-Values R-Value Referenzen Move Semantik std::move Funktionen mit R-Value-Referenz Parametern Fazit

Mehr

SQL Tutorial. SQL - Tutorial SS 06. Hubert Baumgartner. INSO - Industrial Software

SQL Tutorial. SQL - Tutorial SS 06. Hubert Baumgartner. INSO - Industrial Software SQL Tutorial SQL - Tutorial SS 06 Hubert Baumgartner INSO - Industrial Software Institut für Rechnergestützte Automation Fakultät für Informatik Technische Universität Wien Inhalt des Tutorials 1 2 3 4

Mehr

5.6 Vererbung. Vererbung

5.6 Vererbung. Vererbung 5.6 Vererbung Klassen können zueinander in einer "ist ein"- Beziehung stehen Beispiel: Jeder PKW ist ein Kraftfahrzeug, jedes Kraftfahrzeug ist ein Transportmittel aber: auch jeder LKW ist ein Kraftfahrzeug

Mehr

SQL SQL. SQL = Structured Query Language (SEQUEL) IBM San Jose Research Laboratory SYSTEM R. Grundlagen der Datenbanksysteme I

SQL SQL. SQL = Structured Query Language (SEQUEL) IBM San Jose Research Laboratory SYSTEM R. Grundlagen der Datenbanksysteme I SQL SQL = Structured Query Language (SEQUEL) IBM San Jose Research Laboratory SYSTEM R VII-1 Beispielrelationen Filiale ( Name Leiter Stadt Einlagen ) Konto ( KontoNr KundenNr FilialName Saldo ) Kredit

Mehr

ARIS II - Modellierungsmethoden, Metamodelle und Anwendungen

ARIS II - Modellierungsmethoden, Metamodelle und Anwendungen ARIS II - Modellierungsmethoden, Metamodelle und Anwendungen C3: Structured Query Language Lernziele: Nach der Bearbeitung dieser Lektion haben Sie folgende Kenntnisse erworben: Sie können elementaren

Mehr

3 Indizes. 3.1 Indexarchitektur von SQL Server. SQL Server 2008: Datenbankentwicklung

3 Indizes. 3.1 Indexarchitektur von SQL Server. SQL Server 2008: Datenbankentwicklung 3 Indizes 3.1 Indexarchitektur von SQL Server Die folgende Abbildung zeigt die Organisationsstruktur einer Tabelle. Eine Tabelle befindet sich in einer oder mehreren Partitionen, und jede Partition enthält

Mehr

Objektorientierte Programmierung mit Python Polymorphismus und Vererbung. Eltern

Objektorientierte Programmierung mit Python Polymorphismus und Vererbung. Eltern Objektorientierte Programmierung mit Python Polymorphismus und Vererbung Eltern Kind Kind Kind Kind Prinzipien der objektorientierten Programmierung Vererbung Strukturierung von Klassen. Oberbegriffe beschreiben

Mehr

Erste Schritte, um selber ConfigMgr Reports zu erstellen

Erste Schritte, um selber ConfigMgr Reports zu erstellen Thomas Kurth CONSULTANT/ MCSE Netree AG thomas.kurth@netree.ch netecm.ch/blog @ ThomasKurth_CH Erste Schritte, um selber ConfigMgr Reports zu erstellen Configuration Manager Ziel Jeder soll nach dieser

Mehr

2 Was ist VB.NET? 2.1 Unterschiede zu Visual Basic 6

2 Was ist VB.NET? 2.1 Unterschiede zu Visual Basic 6 2 Was ist VB.NET? VB.NET ist eine Programmiersprache basierend auf dem Microsoft.NET- Framework. Das Framework verbindet verschiedene Programmiersprachen. Programme werden zwar in den jeweiligen Programmierspachen

Mehr

Einführung in C# /.NET

Einführung in C# /.NET Einführung in C# /.NET Grundlagen Dr. Beatrice Amrhein Überblick Eine erste Definition von.net Alternativen zu.net Wie funktioniert.net Visual C# Express 2 Definition von.net 3 Der verschiedenen Schichten

Mehr

Wirtschaftsinformatik. SQL Abfragen und QBE. Unterrichtsskript. Version: 2.0

Wirtschaftsinformatik. SQL Abfragen und QBE. Unterrichtsskript. Version: 2.0 Wirtschaftsinformatik SQL Abfragen und QBE Unterrichtsskript Version: 2.0 Autor: Jonas Lanz Datum: 02.06.2006 FHNW Hochschule für Wirtschaft 2 / 29 Inhaltsverzeichnis 1. Einführung 3 1.1 Relationale Operationen

Mehr

Java: Vererbung. Teil 3: super() www.informatikzentrale.de

Java: Vererbung. Teil 3: super() www.informatikzentrale.de Java: Vererbung Teil 3: super() Konstruktor und Vererbung Kindklasse ruft SELBSTSTÄNDIG und IMMER zuerst den Konstruktor der Elternklasse auf! Konstruktor und Vererbung Kindklasse ruft SELBSTSTÄNDIG und

Mehr

Teil II. Objektorientierte Programmierung und objektorientierter Entwurf

Teil II. Objektorientierte Programmierung und objektorientierter Entwurf Teil II Objektorientierte Programmierung und objektorientierter Entwurf 39 Kapitel 8 Robuste Programme durch Ausnahmebehandlung Ziele: Lernen, robuste Programme zu schreiben Ausnahmen als Objekte verstehen

Mehr

Objektorientierte Programmierung. Objektorientierte Programmierung. Klasse. Objekt. Beispiel: Sportfest1. Methode. Eine Einführung mit BlueJ

Objektorientierte Programmierung. Objektorientierte Programmierung. Klasse. Objekt. Beispiel: Sportfest1. Methode. Eine Einführung mit BlueJ Objektorientierte Programmierung Objektorientierte Programmierung Eine Einführung mit BlueJ stellt die Daten, ihre Struktur und ihre Beziehungen zueinander in den Vordergrund. Weniger im Blickpunkt: die

Mehr

Gliederung Grundlagen Schlüsselworte try-catch Fehlerobjekte Fehlerklassen Schlüsselwort finally Schlüsselwort throws selbst erstellte Exceptions

Gliederung Grundlagen Schlüsselworte try-catch Fehlerobjekte Fehlerklassen Schlüsselwort finally Schlüsselwort throws selbst erstellte Exceptions try-catch Schlüsselworte try-catch e Schlüsselwort Schlüsselwort selbst erstellte ermöglichen die Behandlung von Fehlern, die zur Laufzeit entstehen. try-catch in C: Fehler führt immer zum Abbruch des

Mehr

Die SQL-Syntax für den Befehl CREATE TABLE sieht folgendermassen aus:

Die SQL-Syntax für den Befehl CREATE TABLE sieht folgendermassen aus: Einführung in MySQL SQL (Structured Query Language) ist eine Computersprache zum Speichern, Bearbeiten und Abfragen von Daten in relationalen Datenbanken. Eine relationale Datenbank kann man sich als eine

Mehr

php Hier soll ein Überblick über das Erstellen von php Programmen gegeben werden. Inhaltsverzeichnis 1.Überblick...2 2.Parameterübergabe...

php Hier soll ein Überblick über das Erstellen von php Programmen gegeben werden. Inhaltsverzeichnis 1.Überblick...2 2.Parameterübergabe... php Hier soll ein Überblick über das Erstellen von php Programmen gegeben werden. Inhaltsverzeichnis 1.Überblick...2 2.Parameterübergabe...7 3.Zugriff auf mysql Daten...11 Verteilte Systeme: php.sxw Prof.

Mehr

Client-Server-Beziehungen

Client-Server-Beziehungen Client-Server-Beziehungen Server bietet Dienste an, Client nutzt Dienste Objekt ist gleichzeitig Client und Server Vertrag zwischen Client und Server: Client erfüllt Vorbedingungen eines Dienstes Server

Mehr

PIWIN I. Praktische Informatik für Wirtschaftsmathematiker, Ingenieure und Naturwissenschaftler I. Vorlesung 3 SWS WS 2007/2008

PIWIN I. Praktische Informatik für Wirtschaftsmathematiker, Ingenieure und Naturwissenschaftler I. Vorlesung 3 SWS WS 2007/2008 PIWIN I Kap. 7 Objektorientierte Programmierung - Einführung 1 PIWIN I Praktische Informatik für Wirtschaftsmathematiker, Ingenieure und Naturwissenschaftler I Vorlesung 3 SWS WS 2007/2008 FB Informatik

Mehr

Fachbereich Informatik Praktikum 1

Fachbereich Informatik Praktikum 1 Hochschule Darmstadt DATA WAREHOUSE SS2015 Fachbereich Informatik Praktikum 1 Prof. Dr. S. Karczewski Dipl. Inf. Dipl. Math. Y. Orkunoglu Datum: 14.April.2015 1. Kurzbeschreibung In diesem Praktikum geht

Mehr

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck Javadoc Programmiermethodik Eva Zangerle Universität Innsbruck Überblick Einführung Java Ein erster Überblick Objektorientierung Vererbung und Polymorphismus Ausnahmebehandlung Pakete und Javadoc Spezielle

Mehr

Java Einführung Operatoren Kapitel 2 und 3

Java Einführung Operatoren Kapitel 2 und 3 Java Einführung Operatoren Kapitel 2 und 3 Inhalt dieser Einheit Operatoren (unär, binär, ternär) Rangfolge der Operatoren Zuweisungsoperatoren Vergleichsoperatoren Logische Operatoren 2 Operatoren Abhängig

Mehr

4 Vererbung, Polymorphie

4 Vererbung, Polymorphie 4 Vererbung, Polymorphie Jörn Loviscach Versionsstand: 21. März 2014, 22:57 Die nummerierten Felder sind absichtlich leer, zum Ausfüllen beim Ansehen der Videos: http://www.j3l7h.de/videos.html This work

Mehr

2.4.3 Polymorphie (Wiederholung von Alp2)

2.4.3 Polymorphie (Wiederholung von Alp2) 2.4.3 Polymorphie (Wiederholung von Alp2) Sparbuch einsparbuch = new Sparbuch(3.0); Konto einkonto; KontoDrucker = new KontoDrucker(); KontoDrucker.setzeKonto(einSparbuch); einkonto = einsparbuch; Wie

Mehr

Kapitel 3 Das Projekt Bankkonto Seite 1

Kapitel 3 Das Projekt Bankkonto Seite 1 Kapitel 3 Das Projekt Bankkonto Seite 1 3 Das Projekt Bankkonto Nun wirst du dich etwas gründlicher mit dem Quelltext einer Klasse beschäftigen. Du lernst, wie zwei Objekte eine gemeinsame Aufgabe erledigen.

Mehr

Schnittstellen implementieren am Beispiel Suchbaum

Schnittstellen implementieren am Beispiel Suchbaum Motivation Informatik mit Java und BlueJ Schnittstellen implementieren am Beispiel Suchbaum von Bernhard Rosing Schreiben Sie eine Klasse Person, deren Instanzen in ein TreeSet (Suchbaum) eingefügt werden

Mehr

Geordnete Form...36 Erfassung und Speicherung...37 Relationale Datenbanken...37 Einfache Tabellen...37 Objekte und Begriffe relationaler

Geordnete Form...36 Erfassung und Speicherung...37 Relationale Datenbanken...37 Einfache Tabellen...37 Objekte und Begriffe relationaler Inhaltsverzeichnis Einleitung...13 SQL: Die Abfragesprache für Datenbanken...17 Kennzeichnende Merkmale von SQL...17 SQL-Dialekte...18 Kurze Entwicklungsgeschichte...18 SQL/86 oder SQL/1...19 SQL/89 oder

Mehr

Übungsaufgabe Transaktion als Middleware

Übungsaufgabe Transaktion als Middleware Übungsaufgabe Transaktion als Middleware und Java Persistence API Client/Server Abstraktes Komponentenmodell Entscheidende Punkte Erweiterung der Invoke-Methode Context-Verwaltung Transaktionsbehandlung

Mehr

12. ArcView-Anwendertreffen 2010. Workshop Programmierung in ArcGIS. Daniel Fuchs. Wo kann eigene Programmierung in ArcGIS verwendet werden?

12. ArcView-Anwendertreffen 2010. Workshop Programmierung in ArcGIS. Daniel Fuchs. Wo kann eigene Programmierung in ArcGIS verwendet werden? Wo kann eigene Programmierung in ArcGIS verwendet werden? 12. ArcView-Anwendertreffen 2010 Workshop Programmierung in ArcGIS Daniel Fuchs 1) Makros für die Automatisierung einzelner Arbeitsschritte im

Mehr

Chair of Software Engineering. Bezieher SUBSCRIBERS Ereignis Erzeuger (zb GUI) Chair of Software Engineering. Save_file ROUTINE

Chair of Software Engineering. Bezieher SUBSCRIBERS Ereignis Erzeuger (zb GUI) Chair of Software Engineering. Save_file ROUTINE 1 2 Letzte Aktualisierung: 27. Mai 2004 Programmierung im Grossen Vorlesung 13: Ereignis-Gesteuertes Design Bertrand Meyer Ereignis-gesteuerte Programmierung 3 Vermeiden von glue code 4 Verbreiter PUBLISHERS

Mehr

Einführung in ActionScript

Einführung in ActionScript Fachbereich Mathematik und Informatik Softwareprojekt: Spieleprogrammierung Einführung in ActionScript Do, Hoang Viet(do@mi.fu-berlin.de) Freie Universität Berlin, SoSe 2012 Agenda Allgemeine Einführung

Mehr

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005 Einführung in die objektorientierte Programmierung mit Java Klausur am 19. Oktober 2005 Matrikelnummer: Nachname: Vorname: Semesteranzahl: Die Klausur besteht aus drei Frageblöcken zu den Inhalten der

Mehr

Jürgen Bayer. XML- und HTML-Dokumentation mit C#

Jürgen Bayer. XML- und HTML-Dokumentation mit C# Jürgen Bayer XML- und HTML-Dokumentation mit C# Inhaltsverzeichnis 1 Einleitung 1 2 Die XML-Dokumentation 2 2.1 Kompilieren 2 2.2 Vordefinierte XML-Elemente 4 3 Umwandeln der XML-Dokumentation in eine

Mehr