Da ich von Entity Framework 6 aus Perfomancegründen überhaupt nicht zufrieden bin, frage ich mich ernsthaft, wie einige das produktiv einsetzen.
Daraufhin habe ich nach einer Alternative gesucht und bin bei Dapper, einem Projekt von Source stehen geblieben. Hier möchte ich einmal kurz zeigen, wie man mit Dapper eine Liste mit dem erstellten SQL Join erstellt.
Beispiel:
Wir haben in der SQL Datenbank eine Tabelle Automarken und eine andere mit Modelle.
Automarke: Id | Bezeichnung |
Modelle: Id | Bezeichnung | AutomarkeId
Es ist nicht schwer zu erkennen, dass hier eine 1:n Beziehung existiert.
Jetzt wollen wir das ganze in C# abbilden. Dazu bauen wir uns 2 Klassen
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class Automarke { public int Id {get; set;} public int Bezeichnung {get; set;} public ICollection Modelle {get; set;} } public class Modell { public int Id {get; set;} public int Bezeichnung {get; set;} public int AutomarkeId {get; set;} } |
Wir wollen nun eine List<Automarken> gefüllt mit allen Modellen der Automarken haben. Wie machen wir das?
Vielleicht hat der eine oder andere bereits eine Idee, aber denkt mal an die Performance.
Hier kommt Dapper ins Spiel. Dapper mappt für mich mit wenigen Zeilen Code eine Collection ganz nach meinem Geschmack.
Wie das geht, zeige ich hier….
- Am besten und schnellsten ist es, wenn man Dapper von Nuget herunterlädt: Install-Package Dapper
- Wir brauchen ein Objekt der Klasse SqlConnection, welches natürlich erfolgreich zur Datenbank connected ist
Im Grunde war dies auch schon. Ich habe Bemerkungen im Programmcode angefügt, damit es direkt verständlicher ist.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
//Liste, die wir benötigen var output = new List<Automarke>(); //SQL Code, den Dapper als Query nutzt StringBuilder sb = new StringBuilder(); sb.Append("SELECT A.*, M.* FROM Automarke A \n"); sb.Append("INNER JOIN Modell M ON M.AutomarkeId = A.Id \n"); // <Automarke,Modell sind der input und bool dient als dummy Output var dummy = connection.Query<Automarke, Modell, bool>(sb.ToString(), // Erstelle 2 anonyme Klassen a und m aus Automarke und Modell (a, m) => { //Gib mir das Auto mit der Id aus var auto = output.FirstOrDefault(x => x.Id == a.Id); // Ist auto nicht null, d.h. wurde in der List<Automarke> gefunden, if (auto != null) { // für das Modell der Liste Modelle hinzu auto.Modelle.Add(m); } else { // Ansonsten erstelle neue Automarke und füge dies der Liste hinzu output.Add(new Automarke() { Id = a.Id, Bezeichnung = a.Bezeichnung, Modelle = new List<Modelle>() { m }, }); } // Da Query eine Ausgabe verlangt, habe ich mich für ein boolean entschieden. // Was man nun returnt ist in diesem Scenario egal. return true; }, splitOn: "Id").ToList(); |
Login