Die meisten Anwendungen sind datenzentriert, die meisten Data Warehouses sind jedoch relationale Datenbanken. Im Laufe der Jahre haben Designer und Entwickler Anwendungen entworfen, die auf dem Objektmodell basieren.
Objekte sind für die Verbindung von Komponenten verantwortlich, die auf Daten zugreifen – der so genannte Data Access Layer (DAL). Hier müssen wir drei Punkte berücksichtigen:
Alle von einer Anwendung benötigten Daten müssen nicht in einer einzigen Ressource gespeichert werden. Diese Ressource kann eine relationale Datenbank, ein Geschäftsobjekt, eine XML-Datei oder ein WEB-Server sein.
Der Zugriff auf Objekte im Speicher ist einfacher und kostengünstiger als der Zugriff auf Daten in Datenbanken und XML-Dateien.
Die abgerufenen Daten werden nicht direkt verwendet, sondern gespeichert, sortiert, gruppiert, geändert usw.
Daher wäre es sehr nützlich, wenn es Tools gäbe, die alle Arten von Daten mit nur wenigen Codezeilen problemlos integrieren könnten – Tools, die Daten aus verschiedenen Quellen integrieren und grundlegende Datenoperationen durchführen könnten.
Language Integrated Query (LINQ) ist ein solches Tool. LINQ ist eine Erweiterung von .NET Framework 3.5 und seine Verwaltungssprache macht Abfragen eher zu Objekten. Es definiert eine gemeinsame Syntax und ein Programmmodell, das es uns ermöglicht, eine idiomatische Syntax zu verwenden, um die Suche nach verschiedenen Datentypen abzuschließen.
Verwandte Vorgänge wie Such-, Projekt-, Verknüpfungs-, Gruppen-, Partitions-, Mengenoperationen usw. können in LINQ verwendet werden, und die C#- und VB-Compiler in .NET Framework 3.5 unterstützen die LINQ-Syntax, die es ermöglicht, Konfigurationsdaten zu speichern, ohne darauf zurückgreifen zu müssen ADO.NET.
Um beispielsweise die Consumers-Tabelle in der Northwind-Datenbank mithilfe von LINQ in C# abzufragen, sollte der Code wie folgt lauten:
var data = from c in dataContext.Customerswhere c.Country == "Spanien"select c;
In:
Das Schlüsselwort from durchläuft jede Sammlung logisch nacheinander.
Ausdrücke, die das Schlüsselwort where enthalten, vergleichen jedes Objekt in der Sammlung.
Die Select-Anweisung wählt das verglichene Objekt aus, fügt es der Liste hinzu und gibt es zurück.
Das Schlüsselwort var wird für die Variablendeklaration verwendet. Da der genaue Typ des zurückgegebenen Objekts unklar ist, weist dies darauf hin, dass die Informationen dynamisch abgeleitet werden müssen.
LINQ-Abfrageanweisungen können auf jede datengestützte Klasse angewendet werden, die von IEnumerable erbt, wobei T ein beliebiger Datentyp sein kann, z. B. List<Book>.
Schauen wir uns ein Beispiel an, um das Konzept zu verstehen. Im Beispiel wird die folgende Klasse verwendet: Book.cs
public class Books{ public string ID {get;} public string Title { get; } public DateTime DateOfRelease { get; List<Books> list = new List<Books>(); list.Add(new Books { ID = "001", Titel = "Programmierung in C#", Preis = 634,76 m, DateOfRelease = Convert.ToDateTime("2010-02-05") }); list.Add(new Books { ID = "002", Title = "Jave lernen in 30 Tagen", Preis = 250,76 m, DateOfRelease = Convert.ToDateTime ("2011-08-15") }); list.Add(new Books { ID = "003", Titel = "Programmierung in ASP.Net 4.0", Preis = 700,00 m, DateOfRelease = Convert.ToDateTime("2011-02-05") }); Titel = „VB.Net leicht gemacht“, Preis = 500,99 Mio., DateOfRelease = Convert.ToDateTime("2011-12-31") }); list.Add(new Books { ID = "005", Title = "Programming in C", Price = 314.76m, DateOfRelease = Convert.ToDateTime("2010- 02-05") }); list.Add(new Books { ID = "006", Title = "Programmieren in C++", Preis = 456,76 Mio., DateOfRelease = Convert.ToDateTime("2010-02-05") }); list.Add(new Books { ID = "007", Titel = "Datebase Developement", Preis = 1000,76 Mio., DateOfRelease = Convert.ToDateTime("2010-02-05") }); return Liste; }}
Verwenden Sie diese Klasse auf einer Webseite, um über ein einfaches Etikettensteuerelement zum Anzeigen des Buchtitels zu verfügen. Die Page_Load-Methode erstellt eine Liste von Büchern und gibt die Titel mithilfe einer LINQ-Abfrage zurück:
öffentliche Teilklasse simplequery: System.Web.UI.Page{ protected void Page_Load(object sender, EventArgs e) { List<Books> Books = Books.GetBooks(); var booktitles = from b in Books select b.Title foreach ( var title in booktitles) lblbooks.Text += String.Format("{0} <br />", title }}
Wenn die Webseite ausgeführt wird, zeigt das Tag die Abfrageergebnisse an:
Der LINQ-Ausdruck oben:
var booktitles = from b in Books select b.Title;
Entspricht der folgenden SQL-Anweisung:
Titel aus „Bücher“ auswählen
Zusätzlich zu den bisher verwendeten Operatoren gibt es viele weitere Operatoren zum Ausführen von Abfrageklauseln. Schauen wir uns einige Operatoren und Klauseln an.
Die „Join-Klausel“ in SQL wird verwendet, um zwei Datentabellen zu verbinden und eine Sammlung von Daten in Spalten anzuzeigen, die in beiden Datentabellen erscheinen. LINQ kann diese Funktionalität ebenfalls unterstützen. Um dies zu überprüfen, fügen Sie dem vorherigen Projekt eine weitere Klasse mit dem Namen Saledetails.cs hinzu:
public class Salesdetails{ public int sales { get; } public string ID {get;} public static IEnumerable<Salesdetails() { new Salesdetails { ID = „001“, Seiten=678, Verkäufe = 110000}, neue Verkaufsdetails { ID = „002“, Seiten=789, Verkäufe = 60000}, neue Verkaufsdetails { ID = "003", Seiten=456, Verkäufe = 40000}, neue Verkaufsdetails { ID = "004", Seiten=900, Verkäufe = 80000}, neue Verkaufsdetails { ID = „005“, Seiten=456, Verkäufe = 90000}, neue Verkaufsdetails { ID = "006", Seiten=870, Verkäufe = 50000}, neue Verkaufsdetails { ID = "007", Seiten=675, Verkäufe = 40000}, };
Fügen Sie Code in der Page_Load-Funktion hinzu, um die Abfrage für die beiden Tabellen mithilfe der Join-Klauselverarbeitung abzuschließen:
protected void Page_Load(object sender, EventArgs e){ IEnumerable<Books> Books = Books.GetBooks(); IEnumerable<Salesdetails> sales = Salesdetails.getsalesdetails(); var booktitles = from b in Books Join s in sales on b.ID ist gleich s.ID select new { Name = b.Title, Pages = s.pages }; booktitles) lblbooks.Text += String.Format("{0} <br />", title);}
Die Ergebnisseite wird wie folgt angezeigt:
Die where-Klausel ermöglicht das Hinzufügen von Filterbedingungen zur Abfrage. Wenn Sie beispielsweise Bibliografien mit mehr als 500 Seiten erhalten möchten, können Sie das Handle in der Page_Load-Methode so ändern, dass es wie folgt aussieht:
var booktitles = from b in Büchern beitreten s in Verkäufen auf b.ID gleich s.ID wobei s.pages > 500 select new { Name = b.Title, Pages = s.pages };
Die Abfrageanweisung gibt nur die Spalten mit einer Seitenzahl von mehr als 500 zurück:
Mit diesen Klauseln können Abfrageergebnisse sortiert werden. Um Titel, Seitenzahl und Buchpreis abzufragen und nach Preis zu sortieren, schreiben Sie den folgenden Code in das Handle der Page_Load-Methode:
var booktitles = from b in Büchern beitreten s in Verkäufen auf b.ID entspricht s.ID orderby b.Price select new { Name = b.Title, Pages = s.pages, Price = b.Price};
Das zurückgegebene Tupel ist:
Mit der let-Klausel können Sie eine Variable definieren und ihr einen aus den Daten berechneten Wert zuweisen. Um beispielsweise den Gesamtverkaufswert aus den beiden oben genannten Verkaufswerten zu berechnen, müssen Sie ihn wie folgt berechnen:
TotalSale = Preis des Buches * Verkäufe
Um diese Gleichung zu vervollständigen, fügen Sie dem Handle der Page_Load-Methode den folgenden Codeausschnitt hinzu:
Mit der let-Klausel können Sie eine Variable definieren und ihr einen aus den Daten berechneten Wert zuweisen. Um beispielsweise den Gesamtverkaufswert aus den beiden oben genannten Verkaufswerten zu berechnen, müssen Sie ihn wie folgt berechnen:
var booktitles = from b in book join s in sales on b.ID equal s.ID let totalprofit = (b.Price * s.sales) select new { Name = b.Title, TotalSale = totalprofit};
Die Abfrageergebnisse sind wie folgt: