Integrierte deklarative Abfragesprachen in imperativen...

33
Integrierte deklarative Abfragesprachen in imperativen Programmiersprachen am Beispiel von: Language INtegrated Query LINQ Datenabfragen in C# Proseminar Programmierparadigmen und Sprachen Christian Piechnick SS 2009 1

Transcript of Integrierte deklarative Abfragesprachen in imperativen...

Integrierte deklarative Abfragesprachen in imperativen Programmiersprachen am Beispiel von:

Language INtegrated Query – LINQDatenabfragen in C#

ProseminarProgrammierparadigmen und Sprachen

Christian PiechnickSS 2009

1

Agenda

Agenda | Wozu | Was | Woher | Welche | Wie | Warum

1. Wozu LINQ ?

2. Was ist LINQ ?

3. Woher kommt LINQ ?

4. Welche Erweiterungen benötigt LINQ ?

5. Wie funktioniert LINQ ?

6. Warum LINQ / Warum Nicht?

02

01 Wozu LINQ ?

Wie fragen wir normalerweise Daten ab ?

Liefere mir eine Liste

Von allen Webseiten der Welt

die etwas mit LINQ zu tun haben

Datenquelle

Einschränkungen

Ausgabeformat

- deklarativ- mengenorientiert

03Agenda | Wozu | Was | Woher | Welche | Wie | Warum

01 Wozu LINQ ?

Abfragen von Datenbanken in SQL Syntax

Liefere mir eine Liste

Von allen Kunden

Die mehr als 1000 € bezahlt haben

SELECT C.*

FROM Customers C

WHERE ( SELECT SUM(Price) * SUM(Quantity)

FROM Orders O

WHERE O.CustID = C.CustID ) > 1000

04Agenda | Wozu | Was | Woher | Welche | Wie | Warum

01 Wozu LINQ ?

Abfragen in imperativen Programmiersprachen

Liefere mir eine Liste

Von allen Kunden

Die mehr als 1000 € bezahlt haben

List<Customer> selectedCustomers = new List<Customer>();

foreach (Customer customer in context.getCustomers())

{

int sum = 0;

foreach (Order od in customer.Orders)

{

sum += od.UnitPrice * Quantity;

}

if(sum > 1000)

selectedCustomers.Add(customer);

}

05Agenda | Wozu | Was | Woher | Welche | Wie | Warum

01 Wozu LINQ ?

var cust= from c in Customers

where c.Orders.Sum(o => o.UnitPrice * o.Quantity) > 1000

select c;

List<Customer> selectedCustomers = new List<Customer>();

foreach ( Customer customer in getCustomers() )

{

int sum = 0;

foreach (Order od in customer.Orders)

{

sum += od.UnitPrice * Quantity;

}

if(sum > 1000)

selectedCustomers.Add(customer);

}

imperativ

deklerativ

06

Abfragen in LINQ

Agenda | Wozu | Was | Woher | Welche | Wie | Warum

01 Wozu LINQ ?

Wie gehen wir mit heterogenen Datenquellen um ?

Objekte Datenbanken XML-Datein Web Services

DB-

Framework

XML

Library

WS

Library

Programmcode

07Agenda | Wozu | Was | Woher | Welche | Wie | Warum

02 Was ist LINQ ?

08Agenda | Wozu | Was | Woher | Welche | Wie | Warum

02 Was ist LINQ ?

LINQ

- Erweiterung des .NET Frameworks und Spracherweiterungen der .NET Sprachen- Typsichere Abfragesprache auf Ebene der Programmiersprache - SQL-ähnliche Syntax (Syntaxprüfung durch Compiler)- Wählt den Ansatz der deklarativen Programmierung (High-Level)

C# Visual Basic Andere Sprachen

.NET Language Integrated Query (LINQ)

LINQ to

Objects

LINQ to

Dataset

LINQ to

SQL

LINQ to

Entities

LINQ to

XML

LINQ-fähiges ADO.NET

LINQ-fähige Datenquellen

<Book>

<author/>

<Book>

.NET basierte Sprachen

.NET Framework

LINQ Provider

Datenquellen

09Agenda | Wozu | Was | Woher | Welche | Wie | Warum

02 Was ist LINQ ?

LINQ - Frameworkprovider

LINQ to Objects arbeitet auf IEnumerableLINQ to XML arbeitet auf XML Strukturen LINQ to SQL arbeitet auf dem Microsoft SQL ServerLINQ to ADO.NET arbeitet auf ADO.NET DatenquellenLINQ to Entities arbeitet auf beliebigen relativen Datenbanken

LINQ – Weitere Provider

LINQ to AmazonLINQ to NHibernateLINQ to FlickrLINQ to GoogleLINQ to LDAP…

10Agenda | Wozu | Was | Woher | Welche | Wie | Warum

03 Woher kommt LINQ ?

11Agenda | Wozu | Was | Woher | Welche | Wie | Warum

03 Woher kommt LINQ ?

Die .NET Plattform

- .NET ist eine von Microsoft entwickelte Software-Plattform

- 2002 erstmals veröffentlicht (zusammen mit Visual Studio als IDE)

- .NET ist eine Implementierung der CLI (Common Language Infrastructure)

- CLI ist ein ECMA Standard

- soll sprach- und plattformunabhängige Entwicklung und Ausführung ermöglichen

12Agenda | Wozu | Was | Woher | Welche | Wie | Warum

03 Woher kommt LINQ ?

Die .NET Plattform

C# VB.NET C++ …

C#

Compiler

VB.NET

Compiler

C++

Compiler

Zwischencode

JIT Compiler

für Windows

JIT Compiler

für anderes Betriebssystem

Maschinencode Maschinencode

CLRCommon Language Runtime

CILCommon Intermediate Language

CLSCommon Language Specification

13Agenda | Wozu | Was | Woher | Welche | Wie | Warum

04 Welche Erweiterungen benötigt LINQ ?

14Agenda | Wozu | Was | Woher | Welche | Wie | Warum

04 Welche Erweiterungen benötigt LINQ ?

15

Type Inference

var name = „Peter“; String

var num = 25; int

var num2 = 25.5; double

var num3 = 25.5F; float

var cust = new Customer(); Customer

- deklarieren von Variablen ohne explizite Angabe des Typs- implizites Ableiten des Typs durch Deklaration (strenge Typisierung)

- Type Inference sollte nicht aus Faulheit benutzt werden

Verwendung1. Deklaration von Annonyme Typen2. Zur Vermeidung von sehr langen Typen (Rückgabetypen von LINQ-Statements)3. Umgang mit wechselnden Typen während der Entwicklung

Agenda | Wozu | Was | Woher | Welche | Wie | Warum

Was ist LINQ ? - Sprachgrundlagen

16

Type Inference

var name = „Peter“; String

var num = 25; Integer

var num2 = 25.5; Double

var num3 = 25.5F; Float

var cust = new Customer(); Customer

String name = „Peter“;

int num = 25;

double num2 = 25.5;

float num3 = 25.5F;

Customer cust = new Customer();

C#

PseudoCIL

Co

mp

iler

Agenda | Wozu | Was | Woher | Welche | Wie | Warum

Was ist LINQ ? - Sprachgrundlagen

17

Anonyme Typen

var person = new { Name = „Peter“ }

Console.WriteLine( person.Name );

- Klassen ohne vordefinierten Typ

- besitzen nur lesbare Properties

- Typ der Properties wird über Type Inference ermittelt

- Anonyme Typen können nicht praktikabel als Parameter übergeben werden

Verwendung- werden als temporäre Typen für kurze Verarbeitung genutzt

Agenda | Wozu | Was | Woher | Welche | Wie | Warum

04 Welche Erweiterungen benötigt LINQ ?

Extension Methods – Erweiterungsmethoden

- Klassen statisch um Funktionalität erweitern

- Methoden zu Klassen „hinzufügen“ ohne den Quellcode der Klasse zu manipulieren

18

Konsequenzen

- erhöht die Lesbarkeit des Quellcodes

- ermöglicht Interfaces um Funktionalität zu erweitern

Agenda | Wozu | Was | Woher | Welche | Wie | Warum

04 Welche Erweiterungen benötigt LINQ ?

Extension Methods

public static class MyExtensions

{

public static int Add(this int a, int b)

{

return a+b;

}

}

int x = 12;

int c = x.Add( 10 ); //c = 22

19Agenda | Wozu | Was | Woher | Welche | Wie | Warum

04 Welche Erweiterungen benötigt LINQ ?

Extension Methods – „Erweiterung“ von Interfaces

public interface ICatalog

{

void AddItem( String itemName );

}

public static class MyExtensions

{

public static void Sort(this ICatalog catalog)

{

//Implementierung der Sortierung

}

}

20Agenda | Wozu | Was | Woher | Welche | Wie | Warum

04 Welche Erweiterungen benötigt LINQ ?

Wozu Extension Methods – Statische Helper-Klassen vs. Extension Methods

Mit Helper Klasse:MyHelper.filterByName( MyHelper.filterBySalery( persons,1000 ), „Peter );

21

Szenario:

- Personen die einen Namen und ein Gehalt haben

- Man braucht Filter die eine Liste von Personen nach Namen und Gehalt filtern

List<Person> filterByName( List<Person> per, String name )

List<Person> filterBySalery( List<Person> per, int salery )

Mit Extension Methods:persons.filterBySalery( 1000 ).filterByName( „Peter“ );

Agenda | Wozu | Was | Woher | Welche | Wie | Warum

04 Welche Erweiterungen benötigt LINQ ?

Lambda Expressions

- andere Syntax für „annonyme Methoden“ auf Basis von Funktionszeigern (delegates)

- Annonyme Methoden und Delegates wurden mit .NET 2.0 eingeführt

- Lambda Expressions sollen kürzere und besser lesbare Schreibweise darstellen

- Parameters => Body

- „=>“ ist der Lambda Operator

- Func<int, int, int> symbolisiert eine Funktion, die 2 int Objekte als Eingabe auf ein int Objekt abbildet

Func<int, int, int> myFunction = (x,y) => x + y;

myFunction(1,2); //3

22Agenda | Wozu | Was | Woher | Welche | Wie | Warum

04 Welche Erweiterungen benötigt LINQ ?

Lambda Expressions – High Order Functions

- Methoden die andere Methoden als Eingabewerte haben

- Über Funktionszeiger (delegates) ist es möglich Methoden als Parameter zu übergeben

- strenge Typisierung über Generics

Func<int, bool> greaterTwo = x => x > 2;

Func< Func<int,bool>, int, int > myFunction = (f, x) => f(x) ? x + 1 : 1;

myFunc( greaterTwo, 1 ); // 2

myFunc( greaterTwo, 2 ); // 1

23Agenda | Wozu | Was | Woher | Welche | Wie | Warum

04 Welche Erweiterungen benötigt LINQ ?

Expression Trees

- Expression Trees überführen ausführbaren Code in „Daten“

- Expression ist ein DOM für abstract syntax trees

- Expression Trees sehen diesen Baum als Daten

Expression Trees sind kein ausführbarer Code

- können mit der Methode Compile() zur Laufzeit in ausführbaren Code überführt werden

24Agenda | Wozu | Was | Woher | Welche | Wie | Warum

04 Welche Erweiterungen benötigt LINQ ?

25

Expression Trees

Expr< Func< int, int, int > > myExpression = (x,y) => x + y;

Expression

Parameters

x y

Body – Binary Expression

Parameter

Expression

Parameter

Expression

Node Type:

Add

Left Right

x y

Agenda | Wozu | Was | Woher | Welche | Wie | Warum

05 Wie funktioniert LINQ ?

26Agenda | Wozu | Was | Woher | Welche | Wie | Warum

27

Operatoren

- jede Abfrage beginnt mit:

from element in LINQ-fähige-Datenquelle

Restriction Where

Projection Select, SelectMany

Ordering OrderBy, ThenBy

Grouping GroupBy

Quantifiers Any, All

Paritioning Take, Skip, TakeWhile, SkipWhile

Sets Distinct, Union, Intersect, Except

Elements First, FirstOrDefault, ElementAt

Aggregation Count, Sum, Min, Max, Average

Conversion ToArray, ToList, ToDictionary

Agenda | Wozu | Was | Woher | Welche | Wie | Warum

05 Wie funktioniert LINQ ?

05 Was ist LINQ ? - Sprachgrundlagen

28

Ergebnisberchnung

- Datenquelle und select geben an welchen Typ das Ergebnis hat

LINQ-to-ObjectsLINQ-to-XML

LINQ-to-SQLLINQ-to-EntitiesLINQ-to-Dataset

in-memory

delegiert

IEnumerable

IQueryable

Delegates

Expression-Tree

Agenda | Wozu | Was | Woher | Welche | Wie | Warum

29

Ergebnisberchnung mit IQueryable

var query = from entry in dbcontext.Addressbook

where entry.Lastname.StartsWith( „P“ )

select entry;

PrintValues( query ); //Hans Pech, Max Proll

dbcontext.Addressbook.Add( new Entry( „Lisa“, “Pech“ );

PrintValues( query ); //Hans Pech, Max Proll, Lisa Pech

- Bei einer delegierten LINQ-Abfrage wird ein Objekt des Typs IQueryable zurückgegeben

- IQueryable repräsentiert den ExpressionTree der Anfrage mit zusätzlichen Informationen

- erst wenn man mit dem Resultat arbeitet wird der Expression Tree in ausführbaren Code übersetzt

und die Anfrage ausgeführt

Agenda | Wozu | Was | Woher | Welche | Wie | Warum

05 Wie funktioniert LINQ ?

30

Abfragetransformation

var query = from customer in Customers

where customer.Name.startsWith(„A“)

select customer;

var query = Customers.Where( c => c.Name.startsWith(„A“) ).Select( c => c );

- LINQ Keywords sind keine reservierten Keywords sondern kontextuell Keywords

- Jedes LINQ Keyword hat eine äquivalente ExtensionMethod

- Jede LINQ-Abfrage ist in eine äquivalente Form mit ExtensionMethods überführbar

static IEnumerable<T> Where( this IEnumerable<T> source, Func<T,bool> predicate )

Agenda | Wozu | Was | Woher | Welche | Wie | Warum

05 Wie funktioniert LINQ ?

31

Anfragetransformationvar cust = from c in context.Customers

where c.Name = „Peter“

select c;

SELECT C.*

FROM Customers C

WHERE C.Name = „Peter“

LINQ Statement

Lambda Expression

abstractsyntax tree

Datenquell-abhängige Anfrage

var cust = context.Customers.Where( c => c.Name == „Peter“ );In-m

emo

ry

del

egi

ert

Agenda | Wozu | Was | Woher | Welche | Wie | Warum

05 Wie funktioniert LINQ ?

32

PLINQ – Parallel Linq

- deklarativer oder funktionaler Code lässt sich einfacher automatisch parallelisieren

- PLINQ wird Teil des .NET Frameworks 4.0 sein

- Parallelisieren der Anfrageausführung von in-memory-Datenquellen (Objects, XML etc.)

var query = ( from customer in Customers

where customer.Name.startsWith(„A“)

select customer ).AsParallel(2);

Agenda | Wozu | Was | Woher | Welche | Wie | Warum

05 Wie funktioniert LINQ ?

06 Warum LINQ ?

33

Vorteile

- Datenquellenunabhängige Abfragesprache

- Vom Compiler lesbar (syntaktische Fehler werden zur Compile-/Entwicklungszeit erkannt)

- Vom Entwickler lesbar (kürzerer und klarerer Quellcode)

Nachteile

- Erlernen einer „neuen Technologie“

- zum Teil bringen LINQ-Provider spezifische Technologien mit, die man verwenden muss

- zur Zeit kann man in einer Query nur eine delegierende Datenquelle verwenden

Agenda | Wozu | Was | Woher | Welche | Wie | Warum