2017-07-25 4 views
0

Ich verwende Dapper.Mapper für die Zuordnung von SQL-Abfragen zu meinen Anwendungsklassen direkt. Ich dachte, Dapper.Mapper ist nur eine syntaktische Zuckerbeschichtung über Dapper, die ursprüngliche ORM. Aber ich bin immer noch nicht in der Lage, aufgrund sehr weniger Demos und Beispiele damit anzufangen. Allerdings habe ich versucht, diese wie pro ihre git Seite:Wie beginne ich mit Dapper.Mapper?

var sql="Select * from Students where Grades>90"' 
var conn=new MySqlConnection(ConfigurationManager.ConnectionStrings[0].ConnectionString); 
var studentRecord=conn.Query<Students, TopStudents>(sql); 

Und meine POCO-Modelle sind:

//Db table  
public class Students 
{ 
    public int Id{get;set;} 
    public string Name{get;set;} 
    public float Grades{get;set;} 
} 

public class TopStudents 
{ 
    public int Id{get;set;} 
    public string Name{get;set;} 
    public string Grades{get;set;} 
    //...Few more properties 
} 

Aber ich folgende Ausnahme erhalten, No Writable Property for TopStudents found in types Students

Bin ich etwas fehlt? Bitte teilen Sie eine kurze Demo oder ein Tutorial. Es gibt nicht einmal eine richtige Dokumentation, wo ich die Ursache der Ausnahme finden und sie selbst lösen kann. Wie beginne ich mit Dapper.Mapper?

+0

Ihre Abfrage gibt nur 'Studenten' zurück, also warum haben Sie' TopStudents' als Abfrageargument? Sie geben an, welche Objekte von dapper zum Deserialisieren der Zeile verwendet werden sollen. – markpsmith

+0

Okay, lass mich es verstehen, das erste Argument (Student-Objekt) ist die Quelle, deren Ausgabe ich ** zum zweiten Argument (TopStudents-Objekt) zuordnen möchte. Ist dieses Verständnis nicht korrekt? Wenn nicht, bitte korrigieren Sie mich. Danke –

+0

Also es bedeutet, dass der zweite Parameter in '<' and '>' Donot die erste Karte? Wenn ich 4 Joins hätte, wären dort 4 Objekte als Parameter drin? –

Antwort

1

Weitere Informationen finden Sie in der Dokumentation here. Die Beispielabfrage verwendet die Option * und verwendet einen inneren Join, sodass Mitarbeiter- und Abteilungsobjekte zurückgegeben werden. Wenn es wurde nur Mitarbeiter Objekte zurückkehrte, dann würde der Code wie folgt aussehen:

var sql = @"select * from Employee"; 

var employee = connection.Query<Employee, Department>(sql); 

diese Anwendung, um Ihren Code:

var sql="Select * from Students where Grades>90"' 
var conn=new MySqlConnection(ConfigurationManager.ConnectionStrings[0].ConnectionString); 
var studentRecord=conn.Query<Students>(sql); 

Wenn Sie Students und TopStudents zurückkehren wollen, dann würden Sie es ändern zu etwas wie:

var sql="Select * from Students s 
INNER JOIN TopStudents ts where s.Id = ts.Id AND s.Grades>90"' 
var conn=new MySqlConnection(ConfigurationManager.ConnectionStrings[0].ConnectionString); 
var studentRecord=conn.Query<Students, TopStudents>(sql); 
+0

Ohkay jetzt habe ich es..Ich dachte, dass die Ausgabe der Abfrage auf 'Studenten' zugeordnet ist, deren serialisierte Eigenschaft dann auf 'TopStudent' abbildet. Danke für die Klärung :) –

+0

Nur eine letzte Abfrage: Was wird type '' studentRecord' Variable in Ihrer Antwort sein: 'Studenten' oder' TopStudents'? –

+0

'studentRecord' wird sowohl' Student' als auch 'TopStudents' enthalten. Ich bin nicht wirklich sicher, warum Sie diese Technik verwenden, anstatt einfach auf ein benutzerdefiniertes Modell zu mappen. – markpsmith