Integrierte deklarative Abfragesprachen in imperativen...
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 ?
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 ?
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 ?
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
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