Einführung in LINQ. Kapitel 1

Größe: px
Ab Seite anzeigen:

Download "Einführung in LINQ. Kapitel 1"

Transkript

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

2 2 Kapitel 1: Einführung in LINQ Beim Surfen im Web stoßen Sie auf verschiedene Beschreibungen der Language Integrated Query (LINQ), etwa folgende: LINQ bildet ein einheitliches Programmiermodell für alle Formen von Daten. LINQ ermöglicht es Ihnen, über ein konsistentes Modell Daten abzufragen und zu ändern, das unabhängig von Datenquellen ist. Bei LINQ handelt es sich um ein weiteres Werkzeug zur Einbettung von SQL-Abfragen in den Programmcode. LINQ stellt eine weitere Datenabstraktionsschicht dar. All diese Beschreibungen sind auf eine bestimmte Weise korrekt, beziehen sich aber nur jeweils auf einen einzelnen Aspekt. LINQ leistet um ein Vielfaches mehr, als nur SQL-Abfragen einzubetten, es ist erheblich einfacher anzuwenden als ein einheitliches Programmiermodell und es stellt weit mehr dar, als nur eine weitere Reihe von Regeln zur Datenmodellierung. LINQ ist vielmehr eine Methodik, welche die Implementation aller Arten von Datenzugriffen vereinfacht und vereinheitlicht. Dabei werden Sie keineswegs gezwungen, eine bestimmte Architektur zu nutzen, ganz im Gegenteil, LINQ erleichtert die Implementation verschiedener existierender Architekturen zum Datenzugriff. Wie jedes Werkzeug kann es sowohl sinnvoll als auch weniger sinnvoll eingesetzt werden. Um das Maximum herauszuholen, müssen Sie LINQ gut beherrschen. Daten, die in einem Programm verwaltet werden, können heutzutage völlig unterschiedlicher Natur sein. Beispiele sind Arrays, Objektgraphen, XML-Dokumente, Datenbanken, Textdateien, Schlüssel für die Registry, -Nachrichten, Nachrichten im SOAP-Format und Dateien im Microsoft Excel-Format. Die Liste könnte natürlich noch verlängert werden. Jede dieser Datenarten besitzt ihr eigenes spezifisches Zugriffsmodell. Wenn Sie eine Datenbank abfragen, verwenden Sie üblicherweise SQL. Beim Navigieren innerhalb von XML-Daten greifen Sie auf DOM (Document Object Model) oder XQuery zurück. Sie durchlaufen ein Array und entwickeln Algorithmen, um sich durch einen Objektgraphen zu bewegen. Sie verwenden spezifische APIs (Application Programming Interface), um auf andere Arten von Daten zuzugreifen, etwa auf Excel-Dateien, -Nachrichten oder die Registry. Letztendlich verwenden Sie verschiedene Programmiermodelle, um den Zugriff auf verschiedene Datenquellen durchzuführen. Die Vereinheitlichung von Datenzugriffstechniken in einem einzelnen, übergreifenden Modell wurde bereits in vielfacher Weise in Angriff genommen. Beispielweise gibt es ODBC-Provider (Open Database Connectivity), die es erlauben, eine Excel-Datei so abzufragen wie ein WMI-Repository (Windows Management Instrumentation). Jedoch müssen Sie bei dieser Lösung eine SQL-ähnliche Sprache einsetzen, um auf die über ein relationales Modell repräsentierten Daten zuzugreifen. Gelegentlich sind aber Daten so beschaffen, dass sie sich in einem hierarchischen oder grafischen Modell effektiver abbilden lassen als in einem relationalen. Falls ein Datenmodell nicht an die jeweilige Sprache gebunden ist, stellt sich wahrscheinlich außerdem das Problem, dass Sie dann verschiedene Systeme von Datentypen verwalten müssen. All diese Unterschiede können zu einer nur schwer zu überwindenden Unverträglichkeit zwischen Daten und Code führen. LINQ versucht, diese Probleme zu lösen, indem eine einheitliche Möglichkeit des Zugriffs auf und zur Verwaltung von Daten angeboten wird, ohne dass die Anpassung an ein Einheitsmodell erfolgen muss. Dabei werden Gemeinsamkeiten zwischen den Operationen in diesen Datenmodellen gewinnbringend eingesetzt, anstatt die unterschiedlichen Strukturen auf den kleinsten gemeinsamen Nenner zu reduzieren.

3 Was ist LINQ? 3 In diesem Kapitel finden Sie eine umfassende Einführung in LINQ. In den übrigen Kapiteln können Sie Ihr Wissen zu den einzelnen Aspekten dieser neuen und leistungsfähigen Technologie vertiefen. Was ist LINQ? LINQ ist ein Programmiermodell, das Abfragen über ein ausgezeichnetes Konzept in jede Microsoft.NET- Sprache integriert. Jedoch erfordert eine vollständige Unterstützung von LINQ einige Erweiterungen in der jeweilig verwendeten Sprache. Diese Erweiterungen steigern die Leistungsfähigkeit, wobei eine kürzere, aussagekräftigere und»sprechendere«syntax zur Datenveränderung zur Verfügung gestellt wird. Im Folgenden finden Sie eine einfache LINQ-Abfrage einer typischen Softwarelösung, welche die Namen aller in Italien ansässigen Kunden zurückgibt: from c in Customers where c.country == "Italy" select c.companyname; Hinsichtlich der Syntax und Schlüsselwörter (etwa var) sollten Sie sich momentan noch keine Gedanken machen. Das Ergebnis dieser Abfrage ist eine Liste mit Strings. Sie können diese Werte mithilfe einer foreach-schleife in C# durchlaufen: foreach ( string name in query ) { Console.WriteLine( name ); Die beiden eben gezeigten Elemente die query-definition und auch die foreach-schleife bestehen aus regulären C# 3.0-Anweisungen. An dieser Stelle fragen Sie sich vielleicht, was hier abgefragt wird. Um was handelt es sich bei Customers? Ist diese Abfrage eine neue Form von eingebettetem SQL? Dies trifft keinesfalls zu. Ein und dieselbe Abfrage (und der danach folgende foreach-code) kann auf eine SQL-Datenbank, ein DataSet, ein Array von Objekten im Arbeitsspeicher und auf viele weitere Arten von Daten angewendet werden. Customers könnte eine Auflistung von Objekten darstellen: Customer[] Customers; Aber auch um eine DataTable in einem DataSet: DataSet ds = GetDataSet(); DataTable Customers = ds.tables["customers"]; Oder auch um eine Entitätsklasse, die eine physikalische Tabelle innerhalb einer relationalen Datenbank beschreibt: DataContext db = new DataContext( ConnectionString ); Table<Customer> Customers = db.gettable<customer>();

4 4 Kapitel 1: Einführung in LINQ Schließlich könnte Customers auch eine Entitätsklasse repräsentieren, die ein konzeptionelles Modell beschreibt und auf eine relationale Datenbank abgebildet wird: NorthwindModel datamodel = new NorthwindModel(); ObjectQuery<Customer> Customers = datamodel.customers; Die in LINQ verwendete SQL-ähnliche Syntax wird als Abfrageausdruck (query expression) bezeichnet. In Verbindung mit Programmiersprachen, die eine Einbettung von SQL erlauben, wird normalerweise nur eine vereinfachte Syntax zur Verfügung gestellt, um SQL-Anweisungen in der jeweiligen eingesetzten Programmiersprache darzustellen. Die entsprechenden Anweisungen sind aber nicht in der nativen Syntax und im nativen Datentypsystem integriert. Beispielsweise können Sie innerhalb einer SQL-Anweisung keine Funktion aufrufen, die in der Hostsprache (also der jeweiligen Programmiersprache) geschrieben wurde. In LINQ stellt dies dagegen kein Problem dar. Zudem ist LINQ im Unterschied zu eingebettetem SQL nicht auf das Abfragen von Datenbanken beschränkt. Arbeitsweise von LINQ Davon ausgehend, dass das Konzept der eigenen Syntax zur Integration von Abfragen innerhalb einer Programmiersprache klar ist, möchten Sie sicher erfahren, wie dies funktioniert. Wenn Sie den folgenden Code schreiben: Customer[] Customers = GetCustomers(); from c in Customers where c.country == "Italy" select c; erzeugt der Compiler den folgenden Code: Customer[] Customers = GetCustomers(); IEnumerable<Customer> query = Customers.Where( c => c.country == "Italy" ); Von nun an wird die Customers-Deklaration weggelassen, um das Beispiel übersichtlich zu halten. Wird die Abfrage länger, wie im Folgenden zu sehen: from c in Customers where c.country == "Italy" orderby c.name select new { c.name, c.city ; nimmt auch der generierte Code an Länge zu:

5 Was ist LINQ? 5 Customers.Where( c => c.country == "Italy" );.OrderBy( c => c.name ).Select( c => new { c.name, c.city ); Wie zu sehen ist, ruft der Code offenbar Instanzmember des durch den vorigen Aufruf zurückgegebenen Objektes auf. Sie werden sehen, dass dieses scheinbare Verhalten von dem Leistungsmerkmal der Erweiterungsmethoden der Hostsprache (in diesem Fall C#) gesteuert wird. Die Implementation der Methoden Where, OrderBy und Select die in der Beispielabfrage aufgerufen werden, hängt vom Typ von Customers sowie von Namespaces ab, die in vorangegangenen using-anweisungen angegeben wurden. Erweiterungsmethoden sind ein grundlegendes syntaktisches Merkmal, das von LINQ verwendet wird, um den Umgang mit verschiedenen Datenarten mithilfe ein und derselben Syntax zu ermöglichen. HINWEIS Eine Erweiterungsmethode scheint eine Klasse zu erweitern (im Beispiel die Klasse Customers), aber in Wirklichkeit nimmt eine Erweiterungsmethode die Instanz der Klasse, die augenscheinlich erweitert wird, in Gestalt des ersten Arguments entgegen. Das Schlüsselwort var, das bei der Deklaration von query eingesetzt wird, leitet die Variablentypdeklaration aus der ersten Zuweisung ab, die in diesem Fall einen IEnumerable<T>-Typ zurückgibt. Weiterführende Beschreibungen dieser und anderer Spracherweiterungen finden Sie in Kapitel 2»Sprachmerkmale in C#«und in Kapitel 3»Sprachmerkmale in Visual Basic 9.0«. Ein anderes wichtiges Konzept betrifft den Zeitablauf von Operationen, die auf die Daten angewendet werden. Im Allgemeinen wird eine LINQ-Abfrage erst dann wirklich ausgeführt, wenn Zugriff auf das Ergebnis der Abfrage besteht. Denn die Abfrage beschreibt eine ganze Reihe von Operationen, die für die Umsetzung je nach Notwendigkeit infrage kommen. Daher führt der Zugriff auf die Abfrage die eigentliche Arbeit durch. Dies kann im Falle einer foreach-schleife veranschaulicht werden: from c in Customers... foreach ( string name in query )... Es gibt außerdem Methoden, die das Ergebnis einer LINQ-Abfrage durchlaufen und dabei eine persistente Kopie von Daten im Arbeitsspeicher erzeugen. Beispielsweise erstellt die Methode ToList eine typisierte List<T>-Auflistung: from c in Customers... List<Customer> customers = query.tolist(); Wenn die LINQ-Abfrage mit Daten arbeitet, die sich in einer relationalen Datenbank befinden (etwa dem Microsoft SQL Server), generiert die LINQ-Abfrage eine entsprechende SQL-Anweisung, anstatt auf Kopien der Datentabellen im Arbeitsspeicher zurückzugreifen. Die Ausführung der Datenbankabfrage wird bis zum ersten Zugriff auf das Ergebnis der Abfrage zurückgestellt. Handelt es sich also bei den letzten beiden Beispielen bei Customers entweder um einen Table<Customer>-Typ (eine physikalische Tabelle in einer relationalen Datenbank) oder einen ObjectQuery<Customer>-Typ (eine konzeptionelle Entität, die auf eine relationale Datenbank abgebildet wird), wird das entsprechende SQL-Kommando so lange nicht an die Datenbank gesendet, bis im konkreten Fall die foreach-schleife ausgeführt oder die ToList-Methode aufgerufen wird. Denn die LINQ-Abfrage kann bis zu diesem Zeitpunkt auf verschiedene Art und Weise beeinflusst und zusammengestellt werden.

6 6 Kapitel 1: Einführung in LINQ Relationales Modell versus hierarchisches bzw. Graphenmodell Auf den ersten Blick scheint LINQ einfach ein weiterer SQL-Dialekt zu sein. Diese Ähnlichkeit hat ihren Ursprung in der Art, in der eine LINQ-Abfrage die Beziehungen zwischen Entitäten wie einem SQL-Join (also einer Verknüpfung über Tabellen hinweg) beschreiben kann: from c in Customers join o in Orders on c.customerid equals o.customerid select new { c.customerid, c.companyname, o.orderid ; Dies ähnelt dem regulären Weg der Abfrage von Daten in einem relationalen Modell. Jedoch ist LINQ nicht auf eine einzelne Datenart beschränkt, wie dies beim relationalen Modell der Fall ist. Nehmen Sie einmal ein hierarchisches Modell an, in dem jeder Kunde eine eigene Gruppe an Aufträgen hat und jeder Auftrag wiederum eine eigene Liste von Produkten aufweist. In LINQ können Sie die Liste mit den Produkten, die von jedem Kunden bestellt wurden, folgendermaßen abrufen: from c in Customers from o in c.orders select new { c.name, o.quantity, o.product.productname ; Die vorangegangene Abfrage enthält keine Joins. Die Beziehung zwischen Customers und Orders wird durch die zweite from-klausel ausgedrückt, die auf c.orders zurückgreift, um damit die Abfrage»Hole alle Aufträge (Orders) des Customer (Kunden) c«zu formulieren. Die Beziehung zwischen Orders und Products wiederum erfährt ihren Ausdruck durch das Product-Member der Order-Instanz. Das Ergebnis bildet den Produktnamen für jede Zeile der Tabelle mit den Aufträgen über o.product.productname ab. Hierarchische Beziehungen werden über Typdefinitionen mithilfe von Referenzen auf andere Objekte dargestellt. Um die vorangegangene Abfrage zu unterstützen, würden in der Praxis Klassen eingesetzt werden, die in etwa denen aus Listing 1.1 entsprechen: public class Customer { public string Name; public string City; public Order[] Orders; public class Order { public int Quantity; public Product Product; public class Product { public int IdProduct; public decimal Price; public string ProductName; Listing 1.1 Typdeklarationen mit einfachen Beziehungen

7 Was ist LINQ? 7 Allerdings kann es Gelegenheiten geben, bei denen Sie dieselbe Product-Instanz für viele verschiedene Aufträge desselben Produkts verwenden möchten. Sie möchten wahrscheinlich ebenso die Aufträge und Produkte filtern, ohne diese über Customer zu adressieren. Ein typisches Szenario hierfür ist in Listing 1.2 zu sehen: public class Customer { public string Name; public string City; public Order[] Orders; public class Order { public int Quantity; public Product Product; public Customer Customer; public class Product { public int IdProduct; public decimal Price; public string ProductName; public Order[] Orders; Listing 1.2 Typdeklarationen mit Zwei-Wege-Beziehungen Indem Sie ein Array aller Produkte wie folgt deklarieren: Product[] products; können Sie den Objektgraphen abfragen, wobei konkret eine Liste der Aufträge ermittelt wird, in denen das Produkt mit einer ID von 3 enthalten ist: from p in products where p.idproduct == 3 from o in p.orders select o; Mit ein und derselben Abfragesprache führen Sie Abfragen über verschiedene Datenmodelle durch. Wenn Sie keine Beziehung zwischen den Entitäten in der Abfrage definiert haben, können Sie sich immer auf Unterabfragen und Joins stützen, die in der LINQ-Syntax genau wie in einer SQL-Sprache vorhanden sind. Definiert Ihr Datenmodell jedoch bereits Beziehungen zwischen den Entitäten, können Sie diese wirksam einsetzen und Wiederholungen (eine potenzielle Fehlerquelle) ein und derselben Information in vielen Fällen vermeiden. Aber auch dann lassen sich weiterhin explizite Beziehungen in einer LINQ-Abfrage verwenden beispielsweise, wenn Sie irgendeinen Zustand erzwingen, oder Sie einfach Entitäten verknüpfen möchten, die keine nativen Beziehungen besitzen. Stellen Sie sich z. B. vor, dass Sie Kunden und Hersteller suchen möchten, die in derselben Stadt zu finden sind. Ihr Datenmodell stellt möglicherweise keine explizite Beziehung zwischen diesen Attributen zur Verfügung. Dennoch können Sie immer Folgendes schreiben:

8 8 Kapitel 1: Einführung in LINQ from c in Customers join s in Suppliers on c.city equals s.city select new { c.city, c.name, SupplierName = s.name ; Dabei erhalten Sie ein Ergebnis wie etwa das folgende: City=Torino Name=Marco SupplierName=Trucker City=Dallas Name=James SupplierName=FastDelivery City=Dallas Name=James SupplierName=Horizon City=Seattle Name=Frank SupplierName=WayFaster Verfügen Sie über Erfahrung beim Einsatz von SQL-Abfragen, nehmen Sie wahrscheinlich an, dass ein Ergebnis einer Abfrage grundsätzlich eine»rechteckige«tabelle bildet, eine, welche die Daten mithilfe einer Join wie der vorangegangenen einiger Spalten viele Male wiederholt. Jedoch enthält eine Abfrage häufig verschiedene Entitäten mit einer oder mehreren 1-zu-n-Beziehungen. Mit LINQ können Sie Abfragen schreiben, die eine Objekthierarchie oder einen -graphen zurückgeben, wie im Folgenden gezeigt: from c in Customers join s in Suppliers on c.city equals s.city into customersuppliers select new { c.city, c.name, customersuppliers ; Diese letzte Abfrage gibt für jeden Kunden eine Datenzeile zurück, wobei jede davon eine Liste mit Herstellern enthält, die in derselben Stadt wie der Kunde angesiedelt sind. Dieses Ergebnis kann erneut abgefragt werden, wie jeder beliebige andere Objektgraph in LINQ auch. Die in eine hierarchische Form gebrachten Resultate könnten z. B. folgendermaßen aussehen: City=Torino Name=Marco customersuppliers=... customersuppliers: Name=Trucker City=Torino City=Dallas Name=James customersuppliers=... customersuppliers: Name=FastDelivery City=Dallas customersuppliers: Name=Horizon City=Dallas City=Seattle Name=Frank customersuppliers=... customersuppliers: Name=WayFaster City=Seattle Wenn Sie eine Liste von Kunden erhalten möchten und jeden Kunden sowohl mit der Liste von Produkten versehen möchten, die er mindestens einmal bestellt hat, als auch mit der Liste von Herstellern in derselben Stadt, können Sie eine Abfrage wie diese erstellen: from c in Customers select new { c.city, c.name, Products = (from o in c.orders select new { o.product.idproduct, o.product.price ).Distinct(),

9 Was ist LINQ? 9 CustomerSuppliers = from s in Suppliers where s.city == c.city select s ; Werfen Sie nun einen Blick auf das Ergebnis, das ein paar Kunden zeigt, um nachvollziehen zu können, wie die Daten der vorangegangenen einzelnen LINQ-Abfrage zurückgegeben werden: City=Torino Name=Marco Products=... CustomerSuppliers=... Products: IdProduct=1 Price=10 Products: IdProduct=3 Price=30 CustomerSuppliers: Name=Trucker City=Torino City=Dallas Name=James Products=... CustomerSuppliers=... Products: IdProduct=3 Price=30 CustomerSuppliers: Name=FastDelivery City=Dallas CustomerSuppliers: Name=Horizon City=Dallas Diese Form des Resultats würde man nur mühevoll mit einer oder mehreren SQL-Abfragen erzielen, da es eine Analyse der Abfrageergebnisse erfordern würde, um den gewünschten Objektgraphen zu erzeugen. Dagegen bietet LINQ einen einfachen Weg, um Ihre Daten von einem Modell in ein anderes zu verschieben, und verschiedene Varianten, um dasselbe Resultat zu erreichen. Es erfordert LINQ, dass Sie Ihre Daten in Form von Entitäten beschreiben, die ebenso Typen in der Programmiersprache sind. Wenn Sie eine LINQ- Abfrage erzeugen, bildet diese immer eine Gruppe von Operationen, die auf Instanzen einiger Klassen angewendet werden. Diese Objekte können den wirklichen Datencontainer repräsentieren, aber auch eine einfache Beschreibung (mit Ausdrücken in Metadaten) der externen Entität sein, die Sie manipulieren möchten. Eine Abfrage lässt sich nur dann mithilfe einer SQL-Anweisung an eine Datenbank senden, wenn diese an eine Gruppe von Typen angewendet wird, die Tabellen und Beziehungen in der Datenbank abbilden. Nachdem Sie Entitätsklassen definiert haben, können Sie jedoch beide hier beschriebenen Lösungen verwenden (Joins und Steuerung über Entitätsbeziehungen). Die Umwandlung all dieser Operationen in SQL-Anweisungen unterliegt der Verantwortung der LINQ-Engine. HINWEIS Sie können Entitätsklassen unter Zuhilfenahme von Codegeneratoren wie SQLMetal oder dem LINQ to SQL Designer (Letzterer aus dem Microsoft Visual Studio) erstellen. In Listing 1.3 sehen Sie ein Beispiel einer Product-Klasse, die eine relationale Tabelle namens Products abbildet. Diese weist fünf Spalten auf, die den public-datenmembern entsprechen: [Table("Products")] public class Product { [Column(IsPrimaryKey=true)] public int IdProduct; [Column(Name="UnitPrice")] public decimal Price; [Column()] public string ProductName; [Column()] public bool Taxable; [Column()] public decimal Tax; Listing 1.3 Klassendeklaration mit Abbildung auf Datenbanktabelle

10 10 Kapitel 1: Einführung in LINQ Wenn Sie mit Entitäten arbeiten, die externe Daten beschreiben (etwa Datenbanktabellen), können Sie Instanzen dieser Arten von Klassen erzeugen und die Objekte direkt im Arbeitsspeicher manipulieren, so als wären die Daten aus allen Tabellen in den Arbeitsspeicher geladen worden. Die Änderungen werden dann über SQL-Kommandos in der Datenbank ausgeführt, sobald Sie die SubmitChanges-Methode aufrufen, wie es in Listing 1.4 gezeigt wird: var taxableproducts = from p in db.products where p.taxable == true select p; foreach( Product product in taxableproducts ) { RecalculateTaxes( product ); db.submitchanges(); Listing 1.4 Aktualisierung der Datenbank durch Aufruf der Methode SubmitChanges Die Product-Klasse im vorangegangenen Beispiel repräsentiert eine Zeile in der Tabelle Products einer externen Datenbank. Sobald SubmitChanges aufgerufen wird, erzeugen alle geänderten Objekte ein SQL- Kommando, um die entsprechenden Zeilen in der Tabelle zu aktualisieren. HINWEIS Klassenentitäten, die Tabellen und Beziehungen in der Datenbank entsprechen, werden später in Kapitel 5»LINQ to ADO.NET«beschrieben. XML-Manipulation LINQ verfügt zur Manipulation von XML-Daten über einen abweichenden Bestand an Klassen und Erweiterungen, die sich entsprechend von denen aus dem.net Framework bekannten unterscheiden. Sie werden einige Beispiele anhand des folgenden Szenarios anfertigen. Stellen Sie sich vor, Ihre Kunden können Aufträge über XML-Dateien wie der in Listing 1.5 gezeigten Datei Orders.xml erteilen: <?xml version="1.0" encoding="utf-8"?> <orders xmlns=" <order idcustomer="alfki" idproduct="1" quantity="10" price="20.59"/> <order idcustomer="anatr" idproduct="5" quantity="20" price="12.99"/> <order idcustomer="koene" idproduct="7" quantity="15" price="35.50"/> </orders> Listing 1.5 Ein Auszug einer XML-Datei mit Aufträgen Bei Verwendung der standardmäßigen System.Xml-Klassen aus dem Microsoft.NET Framework 2.0 können Sie die Datei mithilfe von DOM laden oder aber deren Inhalte über eine XmlReader-Implementierung einlesen und interpretieren. Unabhängig von der gewählten Lösung müssen Sie sich stets mit Knoten, Knotentypen, XML-Namespaces und vielen weiteren Dingen auseinander setzen, die in der XML-Welt eine Rolle spielen. Viele Entwickler arbeiten nicht gerne mit XML, da es Kenntnisse über eine andere Art von Datenstrukturen erfordert und auch eine eigene Syntax verwendet.

11 Was ist LINQ? 11 Besteht die Notwendigkeit, alle in Auftrag gegebenen Produkte mit der dazugehörigen Anzahl zu extrahieren, können Sie die Auftragsdatei unter Zuhilfenahme eines XmlReader auswerten, wie es in Listing 1.6 gezeigt wird: String nsuri = " XmlReader xmlorders = XmlReader.Create( "Orders.xml" ); List<Order> orders = new List<Order>(); Order order = null; while (xmlorders.read()) { switch (xmlorders.nodetype) { case XmlNodeType.Element: if ((xmlorders.name == "order") && (xmlorders.namespaceuri == nsuri)) { order = new Order(); order.customerid = xmlorders.getattribute( "idcustomer" ); order.product = new Product(); order.product.idproduct = Int32.Parse( xmlorders.getattribute( "idproduct" ) ); order.product.price = Decimal.Parse( xmlorders.getattribute( "price" ) ); order.quantity = Int32.Parse( xmlorders.getattribute( "quantity" ) ); orders.add( order ); break; Listing 1.6 Lesen der XML-Datei mit den Aufträgen über einen XmlReader Sie könnten auch eine XQuery verwenden, um Knoten auszuwählen, wie es hier zu sehen ist: for $order in document("orders.xml")/orders/order return $order Jedoch erfordert XQuery ebenso das Erlernen einer anderen Sprache und Syntax. Darüber hinaus sollte das Ergebnis des obigen XQuery-Beispiels in eine Gruppe von Order-Instanzen konvertiert werden, um eine adäquate Verwendung im Code zu ermöglichen. Zu guter Letzt ist es für viele Entwickler nicht sehr intuitiv. Wie bereits erwähnt, stellt LINQ eine Abfrage-Engine zur Verfügung, die für alle nur denkbaren Arten von Quellen geeignet ist, auch für ein XML-Dokument. Mithilfe von LINQ-Abfragen erreichen Sie dasselbe Ergebnis mit weniger Aufwand und unter Anwendung einer einheitlichen Programmiersprachensyntax. Listing 1.7 zeigt eine LINQ to XML-Abfrage, die auf die Auftragsdatei angewendet wird: XDocument xmlorders = XDocument.Load( "Orders.xml" ); XNamespace ns = " var orders = from o in xmlorders.root.elements( ns + "order" ) select new Order { CustomerID = (String)o.Attribute( "idcustomer" ), Product = new Product {

12 12 Kapitel 1: Einführung in LINQ ; IdProduct = (Int32)o.Attribute("idProduct"), Price = (Decimal)o.Attribute("price"), Quantity = (Int32)o.Attribute("quantity") Listing 1.7 Lesen der XML-Datei per LINQ to XML Mithilfe der neuen Microsoft Visual Basic 9.0-Syntax können Sie sich auf XML-Knoten in Ihrem Code beziehen, indem Sie eine XPath-ähnliche Syntax verwenden, wie es Listing 1.8 zeigt: Imports <xmlns:o=" '... Dim xmlorders As XDocument = XDocument.Load("Orders.xml") Dim orders = _ From o In xmlorders.<o:orders>.<o:order> _ Select New Order With {.CustomerID = o.@idcustomer, _.Product = New Product With {.IdProduct = o.@idproduct,.price = o.@price, _.Quantity = o.@quantity Listing 1.8 Lesen der XML-Datei mit LINQ to XML und Visual Basic 9.0-Syntax Das Ergebnis dieser LINQ to XML-Abfragen könnte dazu verwendet werden, eine Liste aus Order-Entitäten in eine benutzerdefinierte Orders-Eigenschaft zu laden, wobei LINQ to SQL eingesetzt wird, um die Änderungen auf der Ebene der physikalischen Datenbank durchzuführen: customer.orders.addrange( From o In xmlorders.<o:orders>.<o:order> _ Where o.@idcustomer = customer.customerid _ Select New Order With {.CustomerID = o.@idcustomer, _.Product = New Product With {.IdProduct = o.@idproduct,.price = o.@price, _.Quantity = o.@quantity) Möchten Sie ausgehend von Ihren Kundenaufträgen eine Datei Orders.xml erzeugen, können Sie auf jeden Fall die XML-Literale aus Visual Basic 9.0 wirksam einsetzen, um die auszugebende XML-Struktur zu definieren. Wie dies aussehen könnte, zeigt Listing 1.9: Dim xmlorders = <o:orders> <%= From o In orders _ Select <o:order idcustomer=<%= o.customerid %> idproduct=<%= o.product.idproduct %> quantity=<%= o.quantity %> price=<%= o.product.price %>/> %> </o:orders> Listing 1.9 Erzeugen von XML-Code mit Aufträgen per Visual Basic 9.0-XML-Literale

13 Integration in die Programmiersprache 13 Sie werden die Leistungsfähigkeit dieser Lösung sicher zu schätzen lernen. Denn diese Technik behält die XML-Syntax bei, ohne dass die Stabilität von typisiertem Code verloren geht, und erlaubt es, eine Gruppe von Entitäten, die via LINQ to SQL ausgewählt wurden, in ein XML InfoSet umzuwandeln. HINWEIS Mehr Informationen über die LINQ to XML-Syntax und die damit verbundenen Möglichkeiten erfahren Sie in Kapitel 6»LINQ to XML«. Integration in die Programmiersprache Die Integration in die Programmiersprache ist ein grundlegender Aspekt von LINQ. Der augenfälligste Teil ist das Leistungsmerkmal der Abfrageausdrücke, das sich in C# 3.0 und Visual Basic 9.0 findet. Es erlaubt Ihnen, Code wie etwa den folgenden zu erstellen: from c in Customers where c.country == "Italy" orderby c.name select new { c.name, c.city ; anstelle der Verwendung dieses Codes: Customers.Where( c => c.country == "Italy" );.OrderBy( c => c.name ).Select( c => new { c.name, c.city ); Viele Leute sprechen bei dieser Vereinfachung von Syntax Sugaring (wörtlich übersetzt: Versüßung der Syntax), da diese Technik einen einfacheren Weg darstellt, Code zu schreiben, der eine Datenabfrage definiert. Aber dahinter steckt noch mehr. Es sind viele Konstrukte und Syntaxformen notwendig, um das zu unterstützen, was lediglich nach ein paar Zeilen Code zur Anfrage von Daten aussieht. Im Inneren dieses einfachen Abfrageausdrucks gibt es lokale Typinferenzen, Erweiterungsmethoden, Lambda-Ausdrücke, Objektinitialisierungsausdrücke und anonyme Typen. All diese Merkmale sind für sich selbst gesehen sinnvoll, aber wenn Sie das Gesamtbild betrachten, sollten Sie einen großen Schritt in zwei Richtungen sehen: Einer führt zu einem stärker deklarativen Codestil und ein anderer reduziert den Gegensatz der Datenstrukturkonzepte zwischen SQL und objektorientierter Programmierung (diese Diskrepanz wird auch als Impedance Mismatch bezeichnet). Deklarative Programmierung Wie sehen die Unterschiede zwischen einer SQL-Abfrage und einem entsprechenden C# 2.0- oder Visual Basic 8.0-Programm aus, das Daten filtert, die sich in einem nativen Speicher befinden (etwa einer Tabelle bei SQL oder einem Array bei C# oder Visual Basic)? In SQL können Sie Folgendes schreiben:

14 14 Kapitel 1: Einführung in LINQ SELECT * FROM Customers WHERE Country = 'Italy' In C# werden sie wahrscheinlich den folgenden Code verwenden: public List<Customer> ItalianCustomers( Customer customers[] ) { List<Customer> result = new List<Customer>(); foreach( Customer c in customers ) { if (c.country == "Italy") result.add( c ); return result; Beim C#-Code benötigt man mehr Zeit bei der Erstellung und auch das Lesen und Verstehen erfordert einen höheren Aufwand. Aber die entscheidende Betrachtung ist die Tatsache, in welchem Maße der Code aussagekräftig ist, ob es sich um einen»sprechenden«code handelt. In SQL beschreiben Sie, was Sie haben möchten. In C# dagegen beschreiben Sie, wie das erwünschte Ergebnis zu erreichen ist. In SQL unterliegt die Auswahl des am besten geeigneten Algorithmus, um dieses Wie zu erreichen (das in C# ausdrücklicher, konkreter behandelt wird), in der Verantwortung der Abfrage-Engine. Der Grund hierfür ist, dass die SQL- Abfrage-Engine bei der Anwendung von Optimierungen mehr Freiheiten hat als ein C#-Compiler, dem mehr Grenzen durch das vorgegebene Wie auferlegt sind. HINWEIS Das vorangegangene C#-Codebeispiel könnte in.net 2.0 unter Verwendung eines Find-Prädikats geschrieben werden, aber für viele Entwickler ist die benötigte Syntax in Verbindung mit anonymen Delegaten nicht besonders einfach anzuwenden. Jedoch sind die Beispiele lediglich als Veranschaulichung der verschiedenen Programmiermodelle zu sehen. LINQ ermöglicht einen stärker deklarativen Codestil für C# und Visual Basic. Eine LINQ-Abfrage beschreibt Operationen auf Daten über eine deklarative Konstruktion anstelle einer iterativen. Die vom Programmierer verfolgte Absicht lässt sich mit LINQ klarer gestalten. Dieses Wissen über die Intention des Programmierers wiederum ist grundlegend, um eine höhere Ebene von Diensten aus dem darunter befindlichen Framework abrufen zu können. Denken Sie z. B. an das Thema Parallelisierung. Eine SQL-Abfrage kann in einzelne parallel also gleichzeitig ausführbare Operationen aufgeteilt werden, da sie keine Grenzen setzt, was die Art des angewendeten Suchalgorithmus für die Tabelle angeht. Eine foreach-schleife in C# dagegen lässt sich nur schwer in mehrere Schleifen aufteilen, die parallel von verschiedenen Prozessen ausgeführt werden und entsprechend unterschiedliche Teile des Arrays bearbeiten. HINWEIS Parallel LINQ (PLINQ) ist ein Forschungsprojekt, das sich mit der Parallelisierung von LINQ-Code beschäftigt. Deklarative Programmierung kann einen Vorteil aus den Diensten ziehen, die von Compilern und Frameworks angeboten werden, und der Code ist allgemein einfacher zu lesen und zu warten. Dieses einzelne»leistungsmerkmal«kann das wichtigste sein, da es die Produktivität bei der Programmierung erhöht. Nehmen Sie z. B. an, dass Sie eine Liste aller statischen Methoden abrufen möchten, die in der aktuellen AppDomain verfügbar sind und auf einer IEnumerable<T>-Schnittstelle basieren. Zu diesem Zweck können Sie LINQ einsetzen und eine Abfrage erstellen, die sich einer Reflektion bedient:

15 Integration in die Programmiersprache 15 from assembly in AppDomain.CurrentDomain.GetAssemblies() from type in assembly.gettypes() from method in type.getmethods() where method.isstatic && method.returntype.getinterface( "IEnumerable`1" )!= null orderby method.declaringtype.name, method.name group method by new { Class = method.declaringtype.name, Method = method.name ; Der entsprechende C#-Code, der die Daten verarbeitet, ist länger, schwerer zu lesen und wahrscheinlich fehleranfälliger. Listing 1.10 zeigt eine mögliche Version, die nicht besonders optimiert ist: List<String> results = new List<string>(); foreach( var assembly in AppDomain.CurrentDomain.GetAssemblies()) { foreach( var type in assembly.gettypes() ) { foreach( var method in type.getmethods()) { if (method.isstatic && method.returntype.getinterface("ienumerable`1")!= null) { string fullname = String.Format( "{0.{1", method.declaringtype.name, method.name ); if (results.indexof( fullname ) < 0) { results.add( fullname ); results.sort(); Listing 1.10 C#-Code-Entsprechung einer LINQ-Abfrage, die sich einer Reflektion bedient Typüberprüfung Ein weiterer wichtiger Aspekt der Programmiersprachenintegration ist die Typüberprüfung. Wenn Daten per LINQ manipuliert werden, ist grundsätzlich kein unsicherer Cast notwendig. Die kurze Syntax eines Abfrageausdrucks stellt keine Gefährdung der Typüberprüfung dar: Die Daten sind stets streng typisiert, einschließlich der abgefragten Auflistungen und der einzelnen Entitäten, die gelesen und zurückgegeben werden. Die Typüberprüfung der Programmiersprachen, die LINQ unterstützen (derzeit C# 3.0 und Visual Basic 9.0) wird auch dann aufrechterhalten, wenn LINQ-spezifische Merkmale zum Einsatz kommen. Dies ermöglicht die Verwendung von Visual Studio-Leistungsmerkmalen wie IntelliSense und Refactoring (letztere Funktion führt Strukturverbesserungen am Code durch) auch in Verbindung mit LINQ-Abfragen. Diese Visual Studio-Merkmale haben einen entscheidenden Einfluss in Hinblick auf die Produktivität bei der Programmierung.

16 16 Kapitel 1: Einführung in LINQ Typsystemübergreifende Transparenz Wenn Sie sich die Typsysteme des Microsoft.NET Frameworks und des SQL Servers anschauen, werden Sie feststellen, dass diese unterschiedlich sind. Beim Einsatz von LINQ geben Sie dem.net-typsystem Vorrang, da es sich dabei um das Typsystem handelt, das von jeder Programmiersprache unterstützt wird, welche die Verwendung von LINQ-Abfragen erlaubt. Jedoch wird der überwiegende Teil Ihrer Daten in einer relationalen Datenbank gespeichert, und es ist erforderlich, viele Datentypen zwischen diesen beiden Welten zu konvertieren. LINQ führt diese Konvertierung für Sie automatisch durch und macht dabei die Unterschiede in den Typsystemen fast komplett transparent für den Programmierer. HINWEIS Es gibt einige Einschränkungen bei der Konvertierung zwischen verschiedenen Typsystemen und LINQ. Sie finden hierzu einige Hinweise darüber in Kapitel 5. Eine detailliertere Übersicht der Kompatibilitäten hinsichtlich der Typsysteme finden Sie in der Produktdokumentation. LINQ-Implementationen (»Flavors«) LINQ ist eine Technologie, die viele Datenarten abdeckt. Einige dieser Arten sind in den verschiedenen LINQ-Implementationen (die in diesem Zusammenhang oft auch als»linq Flavors«bezeichnet werden; wörtlich übersetzt: Aromen, Geschmacksrichtungen) integriert, die Microsoft als Teil des.net 3.5 Frameworks zur Verfügung stellt, wie in Abbildung 1.1 zu sehen ist. Abbildung 1.1 LINQ-Implementationen, die von Microsoft innerhalb des.net 3.5 Frameworks zur Verfügung gestellt werden Jede dieser Implementationen wird über eine Gruppe von Erweiterungsmethoden definiert, welche die von LINQ zur Verarbeitung der besonderen Datenarten benötigten Operatoren implementieren. Der Zugriff auf diese Merkmale wird über die importierten Namespaces gesteuert. HINWEIS Namespaces werden mithilfe der Schlüsselwörter using (bei C#) und Imports (Visual Basic) in den aktuellen Gültigkeitsbereich (scope) importiert. LINQ to Objects Das Ziel von LINQ to Objects liegt darin, Auflistungen von Objekten zu manipulieren, die untereinander in Beziehung gesetzt werden können, um so eine Hierarchie oder einen Graphen zu bilden. Von einem bestimmten Standpunkt aus gesehen stellt LINQ to Objects die standardmäßige Implementation dar, die von einer LINQ-Abfrage verwendet wird. LINQ to Objects wird durch Einbindung des Namespaces System.Linq aktiviert.

17 LINQ-Implementationen (»Flavors«) 17 HINWEIS Die grundlegenden Konzepte von LINQ werden in Verbindung mit der Verwendung von LINQ to Objects als Referenzimplementation in Kapitel 4,»Grundlagen der LINQ-Syntax«beschrieben. Es wäre grundsätzlich falsch zu denken, dass LINQ to Objects-Abfragen auf Auflistungen von benutzererzeugten Daten beschränkt sind. Wenn Sie Listing 1.11 betrachten, sehen Sie, dass dies nicht zutrifft. Dieses zeigt eine LINQ-Abfrage, die auf Daten angewendet wird, die aus dem Dateisystem stammen. Dabei wird eine Liste aller Dateien des angegebenen Verzeichnisses in den Arbeitsspeicher gelesen, bevor die Dateien mithilfe einer LINQ-Abfrage gefiltert werden: string temppath = Path.GetTempPath(); DirectoryInfo dirinfo = new DirectoryInfo( temppath ); from f in dirinfo.getfiles() where f.length > orderby f.length descending select f; Listing 1.11 Diese LINQ-Abfrage macht alle temporären Dateien ausfindig, die größer als Byte sind, und sortiert diese nach Größe LINQ to ADO.NET LINQ to ADO.NET integriert verschiedene LINQ-Implementationen, die allesamt zur Manipulation von relationalen Daten bestimmt sind. Es enthält zusätzliche Technologien, die für jede einzelne Persistenzschicht spezifisch ist: LINQ to SQL kümmert sich um die Zuordnung zwischen eigenen Typen in C# und dem physikalischen Tabellenschema. LINQ to Entities weist in mehrfacher Weise Gemeinsamkeiten mit LINQ to SQL auf. Jedoch wird nicht eine physikalische Datenbank als Persistenzschicht eingesetzt, sondern das konzeptionelle EDM (Entity Data Model). Das Ergebnis ist eine Abstraktionsschicht, die sich unabhängig von der physikalischen Datenschicht zeigt. LINQ to DataSet ermöglicht es, mit LINQ ein DataSet abzufragen. LINQ to SQL und LINQ to Entities haben Ähnlichkeiten, da sie beide auf Informationen zugreifen, die in einer relationalen Datenbank gespeichert sind, und in Verbindung mit Objektentitäten arbeiten, die externe Daten im Arbeitsspeicher abbilden. Der Hauptunterschied liegt darin, dass beide auf unterschiedlichen Abstraktionsschichten agieren. Während LINQ to SQL an die physikalische Datenbankstruktur gebunden ist, basiert LINQ to Entities auf einem konzeptionellen Modell (Geschäftsentitäten), das weitab von einer physikalischen Struktur (Datenbanktabellen) angesiedelt sein kann. Der Grund für diese unterschiedlichen Varianten beim Zugriff auf relationale Daten mit LINQ liegt darin, dass heutzutage verschiedene Modelle für Datenbankzugriffe in Gebrauch sind. Einige Unternehmen implementieren sämtliche Zugriffe über gespeicherte Prozeduren, einschließlich aller Arten von Datenbankabfragen, ohne auf dynamische Abfragen zurückzugreifen. Viele andere Firmen verwenden dagegen gespeicherte Prozeduren nur zum Einfügen, Aktualisieren und Löschen von Daten und setzen zur Datenabfrage dynamisch erzeugte SELECT-Anweisungen ein. Einige wiederum betrachten die Datenbank als eine einfache Schicht zur Persistenzmachung von Objekten, während Andere diverse Geschäftslogik in der Datenbank verankern, etwa

18 18 Kapitel 1: Einführung in LINQ Trigger, gespeicherte Prozeduren oder beides. LINQ versucht, Hilfestellungen und Verbesserungen beim Datenbankzugriff zu bieten, ohne jeden zu zwingen, ein universelles einzelnes Modell einzuführen. HINWEIS Die Anwendung von LINQ to ADO.NET-Leistungsmerkmalen hängt von der Einbeziehung bestimmter Namespaces in den Gültigkeitsbereich ab. LINQ to ADO.NET-Implementationen und weitere Details werden in Kapitel 5 untersucht. LINQ to XML LINQ to XML bietet in Verbindung mit XML-Daten eine leicht abweichende Syntax an, welche Datenabfragen und -veränderungen ermöglicht. Eine besondere Art der Unterstützung für LINQ to XML findet sich in Visual Basic 9.0, das XML-Literale in die Programmiersprache integriert. Diese erweiterte Unterstützung vereinfacht den Code, der zur Manipulation von XML-Daten notwendig ist. Dabei können Sie konkret eine Abfrage wie die folgende in Visual Basic 9.0 schreiben: Dim book = _ <Book Title="Introducing LINQ"> <%= From person In team _ Where person.role = "Author" _ Select <Author><%= person.name %></Author> %> </Book> Diese Abfrage entspricht der folgenden C# 3.0-Syntax: var book = new XElement( "Book", new XAttribute( "Title", "Introducing LINQ" ), from person in team where person.role == "Author" select new XElement( "Author", person.name ) ); HINWEIS Mehr Informationenen zur XML-Unterstützung in Visual Basic finden Sie in Kapitel 3. Die allgemeine LINQ to XML-Implementation wird in Kapitel 6 beschrieben. LINQ heute und morgen Zum Redaktionsschluss dieses Buches befand sich LINQ noch in einem Betastadium. Die erste Version von LINQ erschien im September 2005 als technische Vorabversion. Seit diesem Zeitpunkt hat sich LINQ von einer Visual Studios 2005-Erweiterung zu einem integrierten Bestandteil der nächsten Versionen von.net Framework (Version 3.5) und Visual Studio (Codename»Orcas«) weiterentwickelt. ACHTUNG Dieses Buch basiert auf Betacode! Da sich das gesamte Buch auf Betacode stützt, können in der endgültigen Version einige Merkmale verändert, entfernt oder hinzugefügt worden sein. Dadurch kann es sein, dass einige in diesem Buch gezeigten Beispiele nicht mehr funktionieren oder ihren Sinn verloren haben. Die Autoren haben aber versucht, das Buch auf dem aktuellen Stand zu halten und es auf die aktuellsten verfügbaren Informationen anzupassen. In jedem Fall werden Neuigkeiten, Buchkorrekturen und aktualisierte Codebeispiele auf der Webseite zum Buch veröffentlicht:

19 Zusammenfassung 19 Die erste offizielle Version von LINQ wird direkt einige Datenarten unterstützen, wie sie im Abschnitt»LINQ-Implementationen«(Seite 16) zu sehen sind. Jedoch kann es sein, dass LINQ erweitert wird und somit eine Unterstützung für zusätzliche Datenarten bietet. Mögliche Erweiterungen könnten etwa LINQ to SharePoint, LINQ to Exchange und LINQ to OLAP sein, um nur ein paar Beispiele zu nennen. Genau genommen sind einige denkbare Implementationen bereits unter Zuhilfenahme von LINQ to Objects verfügbar Sie haben bereits eine mögliche LINQ to Reflection-Abfrage im Abschnitt»LINQ to Objects«(Seite 16) gesehen. Einen weiteren Punkt in der Erweiterbarkeit von LINQ betrifft das in LINQ to SQL und LINQ to Entities integrierte Providermodell. Die Betaversionen von LINQ unterstützen lediglich SQL Server-Datenbanken, aber es ist möglich, Provider für beliebig andere relationale Datenbanken zu implementieren. Es ist zu erwarten, dass viele Entwickler-Communities und Fremdanbieter solche Provider entwickeln werden. LINQ wird wahrscheinlich eine Auswirkung auf die Art und Weise haben, wie Anwendungen entwickelt werden. Es wäre aber ein Fehler zu denken, dass LINQ zu einer Änderung der Architektur von Anwendungen führen wird, denn das Ziel von LINQ liegt darin, eine Reihe von Werkzeugen zur Verfügung zu stellen, welche die Codeimplementation in Hinblick auf verschiedene, vorhandene Architekturen verbessern. Jedoch muss spekuliert werden, dass LINQ sich auf einige kritische Teile einer mehrschichtigen Lösung auswirken kann. Vorstellbar ist z. B. der Einsatz von LINQ in einer gespeicherten Prozedur der SQLCLR (SQL Server Common Language Runtime) mit einer direkten Übertragung des Abfrageausdrucks an die SQL-Engine als Ersatz für die Verwendung einer SQL-Anweisung. Aus LINQ können viele mögliche Entwicklungen hervorgehen und es sollte nicht vergessen werden, dass SQL ein weit verbreiteter und weithin akzeptierter Standard ist, der nicht so einfach aus Performancegründen durch einen anderen ersetzt werden kann. Nichtsdestotrotz ist LINQ ein viel versprechender Schritt in der Entwicklung der aktuellen großen Programmiersprachen. Der deklarative Charakter der Syntax könnte auch für Anwendungen außerhalb des Datenzugriffs interessant sein. In diesem Zusammenhang wurde bereits auf PLINQ hingewiesen, ein Forschungsprojekt, das ein Beispiel für aktuelle Untersuchungen in dieser Richtung ist. Ein ausführendes Framework kann einem Programm, das auf einer höheren Abstraktionsschicht läuft, wie sie LINQ darstellt, viele zusätzliche Dienste anbieten. Ein gutes Verständnis für diese neue Technologie mag heute»nur«wichtig sein, in Zukunft aber könnte es entscheidend sein. Zusammenfassung In diesem Kapitel wurde LINQ eingeführt und grob skizziert, wie es arbeitet. Es wurde ebenso untersucht, wie verschiedene Arten von Daten über eine einheitliche Syntax, die in aktuellen und weit verbreiteten Programmiersprachen wie C# und Visual Basic integriert sind, abgefragt und manipuliert werden können. Die Vorteile, die sich aus der Sprachintegration ergeben, wurden näher beleuchtet einschließlich der deklarativen Programmierung, der Typüberprüfungen und der Transparenz über verschiedene Typsysteme hinweg. Die in.net 3.5 verfügbaren LINQ-Implementationen LINQ to Objects, LINQ to ADO.NET und LINQ to XML wurden kurz vorgestellt. Eine ausführliche Behandlung erfolgt in späteren Kapiteln dieses Buches. Abschließend wurde der aktuelle Stand von LINQ betrachtet und eine Prognose hinsichtlich etwaiger zukünftiger Entwicklungen gewagt.

20

Objektorientierte Programmierung

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

Mehr

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

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

Mehr

Zwischenablage (Bilder, Texte,...)

Zwischenablage (Bilder, Texte,...) Zwischenablage was ist das? Informationen über. die Bedeutung der Windows-Zwischenablage Kopieren und Einfügen mit der Zwischenablage Vermeiden von Fehlern beim Arbeiten mit der Zwischenablage Bei diesen

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

Datenbanken Kapitel 2

Datenbanken Kapitel 2 Datenbanken Kapitel 2 1 Eine existierende Datenbank öffnen Eine Datenbank, die mit Microsoft Access erschaffen wurde, kann mit dem gleichen Programm auch wieder geladen werden: Die einfachste Methode ist,

Mehr

4 Aufzählungen und Listen erstellen

4 Aufzählungen und Listen erstellen 4 4 Aufzählungen und Listen erstellen Beim Strukturieren von Dokumenten und Inhalten stellen Listen und Aufzählungen wichtige Werkzeuge dar. Mit ihnen lässt sich so ziemlich alles sortieren, was auf einer

Mehr

L10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016

L10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016 L10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016 Referentin: Dr. Kelly Neudorfer Universität Hohenheim Was wir jetzt besprechen werden ist eine Frage, mit denen viele

Mehr

Arbeiten mit UMLed und Delphi

Arbeiten mit UMLed und Delphi Arbeiten mit UMLed und Delphi Diese Anleitung soll zeigen, wie man Klassen mit dem UML ( Unified Modeling Language ) Editor UMLed erstellt, in Delphi exportiert und dort so einbindet, dass diese (bis auf

Mehr

5 DATEN. 5.1. Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

5 DATEN. 5.1. Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu Daten Makro + VBA effektiv 5 DATEN 5.1. Variablen Variablen können beliebige Werte zugewiesen und im Gegensatz zu Konstanten jederzeit im Programm verändert werden. Als Variablen können beliebige Zeichenketten

Mehr

Speicher in der Cloud

Speicher in der Cloud Speicher in der Cloud Kostenbremse, Sicherheitsrisiko oder Basis für die unternehmensweite Kollaboration? von Cornelius Höchel-Winter 2013 ComConsult Research GmbH, Aachen 3 SYNCHRONISATION TEUFELSZEUG

Mehr

Kapitel 4 Die Datenbank Kuchenbestellung Seite 1

Kapitel 4 Die Datenbank Kuchenbestellung Seite 1 Kapitel 4 Die Datenbank Kuchenbestellung Seite 1 4 Die Datenbank Kuchenbestellung In diesem Kapitel werde ich die Theorie aus Kapitel 2 Die Datenbank Buchausleihe an Hand einer weiteren Datenbank Kuchenbestellung

Mehr

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang sysplus.ch outlook - mail-grundlagen Seite 1/8 Outlook Mail-Grundlagen Posteingang Es gibt verschiedene Möglichkeiten, um zum Posteingang zu gelangen. Man kann links im Outlook-Fenster auf die Schaltfläche

Mehr

etutor Benutzerhandbuch XQuery Benutzerhandbuch Georg Nitsche

etutor Benutzerhandbuch XQuery Benutzerhandbuch Georg Nitsche etutor Benutzerhandbuch Benutzerhandbuch XQuery Georg Nitsche Version 1.0 Stand März 2006 Versionsverlauf: Version Autor Datum Änderungen 1.0 gn 06.03.2006 Fertigstellung der ersten Version Inhaltsverzeichnis:

Mehr

Windows. Workshop Internet-Explorer: Arbeiten mit Favoriten, Teil 1

Windows. Workshop Internet-Explorer: Arbeiten mit Favoriten, Teil 1 Workshop Internet-Explorer: Arbeiten mit Favoriten, Teil 1 Wenn der Name nicht gerade www.buch.de oder www.bmw.de heißt, sind Internetadressen oft schwer zu merken Deshalb ist es sinnvoll, die Adressen

Mehr

Unsere Webapplikation erweitern

Unsere Webapplikation erweitern Unsere Webapplikation erweitern Um die Webapplikation zu benutzen: 1. Starten Sie den Server, indem Sie das Hauptprogramm in der Klasse ImdbServer starten. 2. Laden Sie im Browser die Seite http://localhost:8080/html/index.html.

Mehr

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom 21.10.2013b

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom 21.10.2013b AGROPLUS Buchhaltung Daten-Server und Sicherheitskopie Version vom 21.10.2013b 3a) Der Daten-Server Modus und der Tresor Der Daten-Server ist eine Betriebsart welche dem Nutzer eine grosse Flexibilität

Mehr

Enigmail Konfiguration

Enigmail Konfiguration Enigmail Konfiguration 11.06.2006 Steffen.Teubner@Arcor.de Enigmail ist in der Grundkonfiguration so eingestellt, dass alles funktioniert ohne weitere Einstellungen vornehmen zu müssen. Für alle, die es

Mehr

Melde- und Veröffentlichungsplattform Portal (MVP Portal) Hochladen einer XML-Datei

Melde- und Veröffentlichungsplattform Portal (MVP Portal) Hochladen einer XML-Datei Seite 1 Melde- und Veröffentlichungsplattform Portal (MVP Portal) Hochladen einer XML-Datei Seite 2 1 Inhalt Melde- und Veröffentlichungsplattform Portal... 1 (MVP Portal)... 1 Hochladen einer XML-Datei...

Mehr

mobilepoi 0.91 Demo Version Anleitung Das Software Studio Christian Efinger Erstellt am 21. Oktober 2005

mobilepoi 0.91 Demo Version Anleitung Das Software Studio Christian Efinger Erstellt am 21. Oktober 2005 Das Software Studio Christian Efinger mobilepoi 0.91 Demo Version Anleitung Erstellt am 21. Oktober 2005 Kontakt: Das Software Studio Christian Efinger ce@efinger-online.de Inhalt 1. Einführung... 3 2.

Mehr

Handbuch Fischertechnik-Einzelteiltabelle V3.7.3

Handbuch Fischertechnik-Einzelteiltabelle V3.7.3 Handbuch Fischertechnik-Einzelteiltabelle V3.7.3 von Markus Mack Stand: Samstag, 17. April 2004 Inhaltsverzeichnis 1. Systemvorraussetzungen...3 2. Installation und Start...3 3. Anpassen der Tabelle...3

Mehr

PTV VISWALK TIPPS UND TRICKS PTV VISWALK TIPPS UND TRICKS: VERWENDUNG DICHTEBASIERTER TEILROUTEN

PTV VISWALK TIPPS UND TRICKS PTV VISWALK TIPPS UND TRICKS: VERWENDUNG DICHTEBASIERTER TEILROUTEN PTV VISWALK TIPPS UND TRICKS PTV VISWALK TIPPS UND TRICKS: VERWENDUNG DICHTEBASIERTER TEILROUTEN Karlsruhe, April 2015 Verwendung dichte-basierter Teilrouten Stellen Sie sich vor, in einem belebten Gebäude,

Mehr

Hilfe Bearbeitung von Rahmenleistungsverzeichnissen

Hilfe Bearbeitung von Rahmenleistungsverzeichnissen Hilfe Bearbeitung von Rahmenleistungsverzeichnissen Allgemeine Hinweise Inhaltsverzeichnis 1 Allgemeine Hinweise... 3 1.1 Grundlagen...3 1.2 Erstellen und Bearbeiten eines Rahmen-Leistungsverzeichnisses...

Mehr

Ist Fernsehen schädlich für die eigene Meinung oder fördert es unabhängig zu denken?

Ist Fernsehen schädlich für die eigene Meinung oder fördert es unabhängig zu denken? UErörterung zu dem Thema Ist Fernsehen schädlich für die eigene Meinung oder fördert es unabhängig zu denken? 2000 by christoph hoffmann Seite I Gliederung 1. In zu großen Mengen ist alles schädlich. 2.

Mehr

Lizenzierung von SharePoint Server 2013

Lizenzierung von SharePoint Server 2013 Lizenzierung von SharePoint Server 2013 Das Lizenzmodell von SharePoint Server 2013 besteht aus zwei Komponenten: Serverlizenzen zur Lizenzierung der Serversoftware und CALs zur Lizenzierung der Zugriffe

Mehr

Studentische Lösung zum Übungsblatt Nr. 7

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

Mehr

5.2 Neue Projekte erstellen

5.2 Neue Projekte erstellen 5.2 Neue Projekte erstellen Das Bearbeiten von bestehenden Projekten und Objekten ist ja nicht schlecht wie aber können Sie neue Objekte hinzufügen oder gar völlig neue Projekte erstellen? Die Antwort

Mehr

Menü Macro. WinIBW2-Macros unter Windows7? Macros aufnehmen

Menü Macro. WinIBW2-Macros unter Windows7? Macros aufnehmen Menü Macro WinIBW2-Macros unter Windows7?... 1 Macros aufnehmen... 1 Menübefehle und Schaltflächen in Macros verwenden... 4 Macros bearbeiten... 4 Macros löschen... 5 Macro-Dateien... 5 Macros importieren...

Mehr

Kapitel 33. Der xml-datentyp. In diesem Kapitel: Der xml-datentyp 996 Abfragen aus xml-datentypen 1001 XML-Indizierung 1017 Zusammenfassung 1023

Kapitel 33. Der xml-datentyp. In diesem Kapitel: Der xml-datentyp 996 Abfragen aus xml-datentypen 1001 XML-Indizierung 1017 Zusammenfassung 1023 Kapitel 33 Der xml-datentyp In diesem Kapitel: Der xml-datentyp 996 Abfragen aus xml-datentypen 1001 XML-Indizierung 1017 Zusammenfassung 1023 995 996 Kapitel 33: Der xml-datentyp Eine der wichtigsten

Mehr

Advoware mit VPN Zugriff lokaler Server / PC auf externe Datenbank

Advoware mit VPN Zugriff lokaler Server / PC auf externe Datenbank Advoware mit VPN Zugriff lokaler Server / PC auf externe Datenbank Die Entscheidung Advoware über VPN direkt auf dem lokalen PC / Netzwerk mit Zugriff auf die Datenbank des zentralen Servers am anderen

Mehr

Ich liebe Java && Ich liebe C# Rolf Borst

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

Mehr

Einführung in die Programmierung

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

Mehr

8 Access-Abfragen migrieren

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

Mehr

Einführung in die Java- Programmierung

Einführung in die Java- Programmierung Einführung in die Java- Programmierung Dr. Volker Riediger Tassilo Horn riediger horn@uni-koblenz.de WiSe 2012/13 1 Wichtig... Mittags keine Pommes... Praktikum A 230 C 207 (Madeleine + Esma) F 112 F 113

Mehr

Anton Ochsenkühn. amac BUCH VERLAG. Ecxel 2016. für Mac. amac-buch Verlag

Anton Ochsenkühn. amac BUCH VERLAG. Ecxel 2016. für Mac. amac-buch Verlag Anton Ochsenkühn amac BUCH VERLAG Ecxel 2016 für Mac amac-buch Verlag 2 Word-Dokumentenkatalog! Zudem können unterhalb von Neu noch Zuletzt verwendet eingeblendet werden. Damit hat der Anwender einen sehr

Mehr

Abwesenheitsnotiz im Exchange Server 2010

Abwesenheitsnotiz im Exchange Server 2010 Abwesenheitsnotiz im Exchange Server 2010 1.) Richten Sie die Abwesenheitsnotiz in Outlook 2010 ein und definieren Sie, an welche Absender diese gesendet werden soll. Klicken Sie dazu auf Datei -> Informationen

Mehr

Die Statistiken von SiMedia

Die Statistiken von SiMedia Die Statistiken von SiMedia Unsere Statistiken sind unter folgender Adresse erreichbar: http://stats.simedia.info Kategorie Titel Einfach Erweitert Übersicht Datum und Zeit Inhalt Besucher-Demographie

Mehr

Programme im Griff Was bringt Ihnen dieses Kapitel?

Programme im Griff Was bringt Ihnen dieses Kapitel? 3-8272-5838-3 Windows Me 2 Programme im Griff Was bringt Ihnen dieses Kapitel? Wenn Sie unter Windows arbeiten (z.b. einen Brief schreiben, etwas ausdrucken oder ein Fenster öffnen), steckt letztendlich

Mehr

Handbuch ECDL 2003 Basic Modul 5: Datenbank Grundlagen von relationalen Datenbanken

Handbuch ECDL 2003 Basic Modul 5: Datenbank Grundlagen von relationalen Datenbanken Handbuch ECDL 2003 Basic Modul 5: Datenbank Grundlagen von relationalen Datenbanken Dateiname: ecdl5_01_00_documentation_standard.doc Speicherdatum: 14.02.2005 ECDL 2003 Basic Modul 5 Datenbank - Grundlagen

Mehr

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren Lineargleichungssysteme: Additions-/ Subtraktionsverfahren W. Kippels 22. Februar 2014 Inhaltsverzeichnis 1 Einleitung 2 2 Lineargleichungssysteme zweiten Grades 2 3 Lineargleichungssysteme höheren als

Mehr

Ist Excel das richtige Tool für FMEA? Steve Murphy, Marc Schaeffers

Ist Excel das richtige Tool für FMEA? Steve Murphy, Marc Schaeffers Ist Excel das richtige Tool für FMEA? Steve Murphy, Marc Schaeffers Ist Excel das richtige Tool für FMEA? Einleitung Wenn in einem Unternehmen FMEA eingeführt wird, fangen die meisten sofort damit an,

Mehr

Professionelle Seminare im Bereich MS-Office

Professionelle Seminare im Bereich MS-Office Serienbrief aus Outlook heraus Schritt 1 Zuerst sollten Sie die Kontakte einblenden, damit Ihnen der Seriendruck zur Verfügung steht. Schritt 2 Danach wählen Sie bitte Gerhard Grünholz 1 Schritt 3 Es öffnet

Mehr

Suche schlecht beschriftete Bilder mit Eigenen Abfragen

Suche schlecht beschriftete Bilder mit Eigenen Abfragen Suche schlecht beschriftete Bilder mit Eigenen Abfragen Ist die Bilderdatenbank über einen längeren Zeitraum in Benutzung, so steigt die Wahrscheinlichkeit für schlecht beschriftete Bilder 1. Insbesondere

Mehr

Betriebssysteme Arbeiten mit dem Windows Explorer

Betriebssysteme Arbeiten mit dem Windows Explorer Frage: Betriebssysteme Arbeiten mit dem Windows Explorer Was ist der Windows Explorer und welche Funktionen bietet er? Antwort: Der Windows Explorer ist das primäre Windows-eigene Programm zum Kopieren,

Mehr

Software Engineering Klassendiagramme Assoziationen

Software Engineering Klassendiagramme Assoziationen Software Engineering Klassendiagramme Assoziationen Prof. Adrian A. Müller, PMP, PSM 1, CSM Fachbereich Informatik und Mikrosystemtechnik 1 Lesen von Multiplizitäten (1) Multiplizitäten werden folgendermaßen

Mehr

[Customer Service by KCS.net] KEEPING CUSTOMERS SUCCESSFUL

[Customer Service by KCS.net] KEEPING CUSTOMERS SUCCESSFUL [Customer Service by KCS.net] KEEPING CUSTOMERS SUCCESSFUL Was bedeutet Customer Service by KCS.net? Mit der Einführung von Microsoft Dynamics AX ist der erste wichtige Schritt für viele Unternehmen abgeschlossen.

Mehr

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen: VBA Programmierung mit Excel Schleifen 1/6 Erweiterung der Aufgabe Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen: Es müssen also 11 (B L) x 35 = 385 Zellen berücksichtigt

Mehr

XINDICE. The Apache XML Project 3.12.09. Name: J acqueline Langhorst E-Mail: blackyuriko@hotmail.de

XINDICE. The Apache XML Project 3.12.09. Name: J acqueline Langhorst E-Mail: blackyuriko@hotmail.de Name: J acqueline Langhorst E-Mail: blackyuriko@hotmail.de 3.12.09 HKInformationsverarbeitung Kurs: Datenbanken vs. MarkUp WS 09/10 Dozent: Prof. Dr. M. Thaller XINDICE The Apache XML Project Inhalt Native

Mehr

Lizenzierung von SharePoint Server 2013

Lizenzierung von SharePoint Server 2013 Lizenzierung von SharePoint Server 2013 Das Lizenzmodell von SharePoint Server 2013 besteht aus zwei Komponenten: Serverlizenzen zur Lizenzierung der Serversoftware und CALs zur Lizenzierung der Zugriffe

Mehr

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Objektorientierte Programmierung für Anfänger am Beispiel PHP Objektorientierte Programmierung für Anfänger am Beispiel PHP Johannes Mittendorfer http://jmittendorfer.hostingsociety.com 19. August 2012 Abstract Dieses Dokument soll die Vorteile der objektorientierten

Mehr

Übung: Verwendung von Java-Threads

Übung: Verwendung von Java-Threads Übung: Verwendung von Java-Threads Ziel der Übung: Diese Übung dient dazu, den Umgang mit Threads in der Programmiersprache Java kennenzulernen. Ein einfaches Java-Programm, das Threads nutzt, soll zum

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

Veröffentlichen von Apps, Arbeitsblättern und Storys. Qlik Sense 2.0.6 Copyright 1993-2015 QlikTech International AB. Alle Rechte vorbehalten.

Veröffentlichen von Apps, Arbeitsblättern und Storys. Qlik Sense 2.0.6 Copyright 1993-2015 QlikTech International AB. Alle Rechte vorbehalten. Veröffentlichen von Apps, Arbeitsblättern und Storys Qlik Sense 2.0.6 Copyright 1993-2015 QlikTech International AB. Alle Rechte vorbehalten. Copyright 1993-2015 QlikTech International AB. Alle Rechte

Mehr

Mobilgeräteverwaltung

Mobilgeräteverwaltung Mobilgeräteverwaltung Das Mobility Management-Tool ist ein Add-on zur LANDesk Management Suite, mit dem Sie mobile Geräte erkennen können, die auf Microsoft Outlook-Postfächer auf Ihrem System zugreifen.

Mehr

Abschluss Version 1.0

Abschluss Version 1.0 Beschreibung Der Abschluss wird normalerweise nur einmal jährlich durchgeführt. Dieses Tech-Note soll helfen, diesen doch seltenen aber periodisch notwendigen Vorgang problemlos durchzuführen. Abschlussvarianten

Mehr

In diesem Thema lernen wir die Grundlagen der Datenbanken kennen und werden diese lernen einzusetzen. Access. Die Grundlagen der Datenbanken.

In diesem Thema lernen wir die Grundlagen der Datenbanken kennen und werden diese lernen einzusetzen. Access. Die Grundlagen der Datenbanken. In diesem Thema lernen wir die Grundlagen der Datenbanken kennen und werden diese lernen einzusetzen. Access Die Grundlagen der Datenbanken kurspc15 Inhaltsverzeichnis Access... Fehler! Textmarke nicht

Mehr

Zählen von Objekten einer bestimmten Klasse

Zählen von Objekten einer bestimmten Klasse Zählen von Objekten einer bestimmten Klasse Ziel, Inhalt Zur Übung versuchen wir eine Klasse zu schreiben, mit der es möglich ist Objekte einer bestimmten Klasse zu zählen. Wir werden den ++ und den --

Mehr

SOLISYON GMBH TOBIAS GRUBER BEN WEISSMAN. Analyse von Dimensions-Schlüsselfehlern bei der Aufbereitung von SSAS Datenbanken

SOLISYON GMBH TOBIAS GRUBER BEN WEISSMAN. Analyse von Dimensions-Schlüsselfehlern bei der Aufbereitung von SSAS Datenbanken WEITER BLICKEN. MEHR ERKENNEN. BESSER ENTSCHEIDEN. Analyse von Dimensions-Schlüsselfehlern bei der Aufbereitung von SSAS Datenbanken SOLISYON GMBH TOBIAS GRUBER BEN WEISSMAN ANALYSE VON OLAP-AUFBEREITUNGSFEHLERN

Mehr

Geld Verdienen im Internet leicht gemacht

Geld Verdienen im Internet leicht gemacht Geld Verdienen im Internet leicht gemacht Hallo, Sie haben sich dieses E-book wahrscheinlich herunter geladen, weil Sie gerne lernen würden wie sie im Internet Geld verdienen können, oder? Denn genau das

Mehr

mysql - Clients MySQL - Abfragen eine serverbasierenden Datenbank

mysql - Clients MySQL - Abfragen eine serverbasierenden Datenbank mysql - Clients MySQL - Abfragen eine serverbasierenden Datenbank In den ersten beiden Abschnitten (rbanken1.pdf und rbanken2.pdf) haben wir uns mit am Ende mysql beschäftigt und kennengelernt, wie man

Mehr

Handbuch für Redakteure

Handbuch für Redakteure Handbuch für Redakteure Erste Schritte... 1 Artikel erstellen... 2 Artikelinhalt bearbeiten... 3 Artikel bearbeiten... 3 Grunddaten ändern... 5 Weitere Artikeleigenschaften... 5 Der WYSIWYG-Editor... 6

Mehr

Erstellen eigener HTML Seiten auf ewon

Erstellen eigener HTML Seiten auf ewon ewon - Technical Note Nr. 010 Version 1.2 Erstellen eigener HTML Seiten auf ewon 30.08.2006/SI Übersicht: 1. Thema 2. Benötigte Komponenten 3. Funktionsaufbau und Konfiguration 3.1. Unterpunkt 1 3.2. Unterpunkt

Mehr

Einführung in. Logische Schaltungen

Einführung in. Logische Schaltungen Einführung in Logische Schaltungen 1/7 Inhaltsverzeichnis 1. Einführung 1. Was sind logische Schaltungen 2. Grundlegende Elemente 3. Weitere Elemente 4. Beispiel einer logischen Schaltung 2. Notation von

Mehr

GEVITAS Farben-Reaktionstest

GEVITAS Farben-Reaktionstest GEVITAS Farben-Reaktionstest GEVITAS Farben-Reaktionstest Inhalt 1. Allgemeines... 1 2. Funktionsweise der Tests... 2 3. Die Ruhetaste und die Auslösetaste... 2 4. Starten der App Hauptmenü... 3 5. Auswahl

Mehr

Einleitung. Für wen ist dieses Buch

Einleitung. Für wen ist dieses Buch i Willkommen! Dieses Buch aus der Reihe Schritt für Schritt wurde so konzipiert, dass Sie mit dem Buch leicht und einfach die wesentlichen Aspekte beim Einsatz von vier der Microsoft Office 2016- Apps

Mehr

Nutzerhandbuch Zentrale Klassenverwaltung

Nutzerhandbuch Zentrale Klassenverwaltung Nutzerhandbuch Zentrale Klassenverwaltung Nutzerhandbuch Zentrale Klassenverwaltung...1 1. Allgemeines...2 2. Startseite...2 3. Posteingang...2 4. Klassenübersicht...3 4.1. Klassendetailansicht...4 4.2.

Mehr

Konzepte der Informatik

Konzepte der Informatik Konzepte der Informatik Vorkurs Informatik zum WS 2011/2012 26.09. - 30.09.2011 17.10. - 21.10.2011 Dr. Werner Struckmann / Christoph Peltz Stark angelehnt an Kapitel 1 aus "Abenteuer Informatik" von Jens

Mehr

1 topologisches Sortieren

1 topologisches Sortieren Wolfgang Hönig / Andreas Ecke WS 09/0 topologisches Sortieren. Überblick. Solange noch Knoten vorhanden: a) Suche Knoten v, zu dem keine Kante führt (Falls nicht vorhanden keine topologische Sortierung

Mehr

Zahlen auf einen Blick

Zahlen auf einen Blick Zahlen auf einen Blick Nicht ohne Grund heißt es: Ein Bild sagt mehr als 1000 Worte. Die meisten Menschen nehmen Informationen schneller auf und behalten diese eher, wenn sie als Schaubild dargeboten werden.

Mehr

Handbuch. NAFI Online-Spezial. Kunden- / Datenverwaltung. 1. Auflage. (Stand: 24.09.2014)

Handbuch. NAFI Online-Spezial. Kunden- / Datenverwaltung. 1. Auflage. (Stand: 24.09.2014) Handbuch NAFI Online-Spezial 1. Auflage (Stand: 24.09.2014) Copyright 2016 by NAFI GmbH Unerlaubte Vervielfältigungen sind untersagt! Inhaltsangabe Einleitung... 3 Kundenauswahl... 3 Kunde hinzufügen...

Mehr

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag Ludwig-Maximilians-Universität München WS 2015/16 Institut für Informatik Übungsblatt 9 Prof. Dr. R. Hennicker, A. Klarl Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung:

Mehr

Grundlagen verteilter Systeme

Grundlagen verteilter Systeme Universität Augsburg Insitut für Informatik Prof. Dr. Bernhard Bauer Wolf Fischer Christian Saad Wintersemester 08/09 Übungsblatt 3 12.11.08 Grundlagen verteilter Systeme Lösungsvorschlag Aufgabe 1: a)

Mehr

pro4controlling - Whitepaper [DEU] Whitepaper zur CfMD-Lösung pro4controlling Seite 1 von 9

pro4controlling - Whitepaper [DEU] Whitepaper zur CfMD-Lösung pro4controlling Seite 1 von 9 Whitepaper zur CfMD-Lösung pro4controlling Seite 1 von 9 1 Allgemeine Beschreibung "Was war geplant, wo stehen Sie jetzt und wie könnte es noch werden?" Das sind die typischen Fragen, mit denen viele Unternehmer

Mehr

Was sind Jahres- und Zielvereinbarungsgespräche?

Was sind Jahres- und Zielvereinbarungsgespräche? 6 Was sind Jahres- und Zielvereinbarungsgespräche? Mit dem Jahresgespräch und der Zielvereinbarung stehen Ihnen zwei sehr wirkungsvolle Instrumente zur Verfügung, um Ihre Mitarbeiter zu führen und zu motivieren

Mehr

FRILO-Aktuell Ausgabe 2/2013

FRILO-Aktuell Ausgabe 2/2013 FRILO-Aktuell aus dem Hause Nemetschek Frilo, speziell für unsere Software-Service-Kunden, informiert Sie über aktuelle Entwicklungen, Produkte und Neuigkeiten. Inhalt Effektives Arbeiten mit dem Frilo.Document.Designer

Mehr

Ein Blick voraus. des Autors von C++: Bjarne Stroustrup. 04.06.2005 Conrad Kobsch

Ein Blick voraus. des Autors von C++: Bjarne Stroustrup. 04.06.2005 Conrad Kobsch Ein Blick voraus des Autors von C++: Bjarne Stroustrup 04.06.2005 Conrad Kobsch Inhalt Einleitung Rückblick Nur eine Übergangslösung? Was würde C++ effektiver machen? Quelle 2 Einleitung Wo steht C++,

Mehr

Bereich METIS (Texte im Internet) Zählmarkenrecherche

Bereich METIS (Texte im Internet) Zählmarkenrecherche Bereich METIS (Texte im Internet) Zählmarkenrecherche Über die Zählmarkenrecherche kann man nach der Eingabe des Privaten Identifikationscodes einer bestimmten Zählmarke, 1. Informationen zu dieser Zählmarke

Mehr

Visual Basic Express erstes Projekt anlegen

Visual Basic Express erstes Projekt anlegen Inhalt Dokument Beschreibung... 1 Erstes Projekt anlegen... 1 Verweise hinzufügen... 2 Imports setzen... 5 Public Class vorbereiten... 6 Mehrere Tools programmieren... 7 Dokument Beschreibung Nach der

Mehr

CartCalc FAQ (frequently asked questions) häufige Fragen zu CartCalc

CartCalc FAQ (frequently asked questions) häufige Fragen zu CartCalc CartCalc FAQ (frequently asked questions) häufige Fragen zu CartCalc Installation Frage: Wie installiere ich CartCalc? Antwort: Die Installation von CartCalc erfolgt automatisch. Nach Einlegen der Demo-CD

Mehr

ObjectBridge Java Edition

ObjectBridge Java Edition ObjectBridge Java Edition Als Bestandteil von SCORE Integration Suite stellt ObjectBridge Java Edition eine Verbindung von einem objektorientierten Java-Client zu einer fast beliebigen Server-Komponente

Mehr

Anleitung über den Umgang mit Schildern

Anleitung über den Umgang mit Schildern Anleitung über den Umgang mit Schildern -Vorwort -Wo bekommt man Schilder? -Wo und wie speichert man die Schilder? -Wie füge ich die Schilder in meinen Track ein? -Welche Bauteile kann man noch für Schilder

Mehr

Dokumentation IBIS Monitor

Dokumentation IBIS Monitor Dokumentation IBIS Monitor Seite 1 von 16 11.01.06 Inhaltsverzeichnis 1. Allgemein 2. Installation und Programm starten 3. Programmkonfiguration 4. Aufzeichnung 4.1 Aufzeichnung mitschneiden 4.1.1 Inhalt

Mehr

AutoCAD 2007 - Dienstprogramm zur Lizenzübertragung

AutoCAD 2007 - Dienstprogramm zur Lizenzübertragung AutoCAD 2007 - Dienstprogramm zur Lizenzübertragung Problem: Um AutoCAD abwechselnd auf mehreren Rechnern einsetzen zu können konnte man bis AutoCAD 2000 einfach den Dongle umstecken. Seit AutoCAD 2000i

Mehr

Anwendungshinweise zur Anwendung der Soziometrie

Anwendungshinweise zur Anwendung der Soziometrie Anwendungshinweise zur Anwendung der Soziometrie Einführung Die Soziometrie ist ein Verfahren, welches sich besonders gut dafür eignet, Beziehungen zwischen Mitgliedern einer Gruppe darzustellen. Das Verfahren

Mehr

1. Einführung. 2. Alternativen zu eigenen Auswertungen. 3. Erstellen eigener Tabellen-Auswertungen

1. Einführung. 2. Alternativen zu eigenen Auswertungen. 3. Erstellen eigener Tabellen-Auswertungen 1. Einführung Über die Tabellen-Auswertungen können Sie eigene Auswertungen nach Ihren Wünschen erstellen. Diese Auswertungen werden immer anhand der aktuellen Daten aus orgamax ermittelt, Sie können also

Mehr

OECD Programme for International Student Assessment PISA 2000. Lösungen der Beispielaufgaben aus dem Mathematiktest. Deutschland

OECD Programme for International Student Assessment PISA 2000. Lösungen der Beispielaufgaben aus dem Mathematiktest. Deutschland OECD Programme for International Student Assessment Deutschland PISA 2000 Lösungen der Beispielaufgaben aus dem Mathematiktest Beispielaufgaben PISA-Hauptstudie 2000 Seite 3 UNIT ÄPFEL Beispielaufgaben

Mehr

Stammdatenanlage über den Einrichtungsassistenten

Stammdatenanlage über den Einrichtungsassistenten Stammdatenanlage über den Einrichtungsassistenten Schritt für Schritt zur fertig eingerichteten Hotelverwaltung mit dem Einrichtungsassistenten Bitte bereiten Sie sich, bevor Sie starten, mit der Checkliste

Mehr

Kapitel 3 Bilder farblich verändern - Arbeiten mit Objekten

Kapitel 3 Bilder farblich verändern - Arbeiten mit Objekten Nahezu auf jedem Buchcover, CD Hülle oder auf den Werbeseiten in Zeitschriften und Magazinen, sehen Sie fast ausschließlich Bilder, die mit einem EBV Programm einen sogenannten künstlerischen Touch erhalten

Mehr

Umzug der Datenbank Firebird auf MS SQL Server

Umzug der Datenbank Firebird auf MS SQL Server Umzug der Datenbank Firebird auf MS SQL Server Umzugsanleitung auf MS SQL Server Im Folgenden wird ein Umzug der julitec CRM Datenbank von Firebird auf MS SQL Server 2008 Express R2 beschrieben. Datensicherung

Mehr

Drucken aus der Anwendung

Drucken aus der Anwendung Drucken aus der Anwendung Drucken aus der Anwendung Nicht jeder Großformatdruck benötigt die volle Funktionsvielfalt von PosterJet - häufig sind es Standarddrucke wie Flussdiagramme und Organigramme die

Mehr

Dokumentation. Black- und Whitelists. Absenderadressen auf eine Blacklist oder eine Whitelist setzen. Zugriff per Webbrowser

Dokumentation. Black- und Whitelists. Absenderadressen auf eine Blacklist oder eine Whitelist setzen. Zugriff per Webbrowser Dokumentation Black- und Whitelists Absenderadressen auf eine Blacklist oder eine Whitelist setzen. Zugriff per Webbrowser Inhalt INHALT 1 Kategorie Black- und Whitelists... 2 1.1 Was sind Black- und Whitelists?...

Mehr

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Java Kurs für Anfänger Einheit 4 Klassen und Objekte Java Kurs für Anfänger Einheit 4 Klassen und Ludwig-Maximilians-Universität München (Institut für Informatik: Programmierung und Softwaretechnik von Prof.Wirsing) 13. Juni 2009 Inhaltsverzeichnis klasse

Mehr

Nutzung dieser Internetseite

Nutzung dieser Internetseite Nutzung dieser Internetseite Wenn Sie unseren Internetauftritt besuchen, dann erheben wir nur statistische Daten über unsere Besucher. In einer statistischen Zusammenfassung erfahren wir lediglich, welcher

Mehr

Kundenspezifische Preise im Shop WyRu Online-Shop

Kundenspezifische Preise im Shop WyRu Online-Shop Kundenspezifische Preise im Shop WyRu Online-Shop Team WyRu Christian Wyk / Günter Rubik SCS Bürocenter B1, A-2334 Vösendorf Internet http://www.wyru.at Kundenspezifische Preise sind ein Feature des WyRu

Mehr

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag Ludwig-Maximilians-Universität München WS 2015/16 Institut für Informatik Übungsblatt 13 Prof. Dr. R. Hennicker, A. Klarl Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung:

Mehr

Präventionsforum+ Erfahrungsaustausch. HANDOUT GRUPPEN-ADMINISTRATOREN Anlage zum Endnutzer-Handbuch. Stand: 11.09.2014 Änderungen vorbehalten

Präventionsforum+ Erfahrungsaustausch. HANDOUT GRUPPEN-ADMINISTRATOREN Anlage zum Endnutzer-Handbuch. Stand: 11.09.2014 Änderungen vorbehalten Präventionsforum+ Erfahrungsaustausch HANDOUT GRUPPEN-ADMINISTRATOREN Anlage zum Endnutzer-Handbuch Stand: 11.09.2014 Änderungen vorbehalten Anlage zum Endnutzer-Handbuch Handout Gruppen-Administratoren

Mehr

Flashfragen in ILIAS Test & Assessment. Helmut Schottmüller

Flashfragen in ILIAS Test & Assessment. Helmut Schottmüller Flashfragen in ILIAS Test & Assessment Helmut Schottmüller Flashfragen in ILIAS Test & Assessment Helmut Schottmüller Veröffentlicht Januar 2009 Copyright 2009 Helmut Schottmüller Inhaltsverzeichnis 1.

Mehr

Gewinnen Sie in Dynamics CRM Erkenntnisse über Ihre Kunden und Ihr Unternehmen im gesamten Social Web in Echtzeit. Version 3.0

Gewinnen Sie in Dynamics CRM Erkenntnisse über Ihre Kunden und Ihr Unternehmen im gesamten Social Web in Echtzeit. Version 3.0 Gewinnen Sie in Dynamics CRM Erkenntnisse über Ihre Kunden und Ihr Unternehmen im gesamten Social Web in Echtzeit. Version 3.0 Eine kurze Einführung in Social Engagement Social Engagement-Dashboards und

Mehr

5. Übung: PHP-Grundlagen

5. Übung: PHP-Grundlagen 5.1. Erstes PHP-Programm 1. Schreiben Sie PHP-Programm innerhalb einer Webseite, d.h. innerhalb eines HTML-Dokument. Ihr PHP-Programm soll einen kurzen Text ausgeben und Komentare enthalten. Speichern

Mehr

HANDBUCH PHOENIX II - DOKUMENTENVERWALTUNG

HANDBUCH PHOENIX II - DOKUMENTENVERWALTUNG it4sport GmbH HANDBUCH PHOENIX II - DOKUMENTENVERWALTUNG Stand 10.07.2014 Version 2.0 1. INHALTSVERZEICHNIS 2. Abbildungsverzeichnis... 3 3. Dokumentenumfang... 4 4. Dokumente anzeigen... 5 4.1 Dokumente

Mehr

Im Original veränderbare Word-Dateien

Im Original veränderbare Word-Dateien Objekte einer Datenbank Microsoft Access Begriffe Wegen seines Bekanntheitsgrades und der großen Verbreitung auch in Schulen wird im Folgenden eingehend auf das Programm Access von Microsoft Bezug genommen.

Mehr