2017-07-25 1 views
0

J'utilise Dapper.Mapper pour mapper directement les requêtes Sql à mes classes d'application. Je croyais Dapper.Mapper est juste un sucre-revêtement syntaxique sur , l'original ORM. Mais, je ne suis toujours pas capable de commencer avec cela à cause de très moins de démos et d'exemples. Cependant, je l'ai essayé selon leur page git:Comment utiliser 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); 

Et mes modèles POCO sont:

//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 
} 

Mais je reçois exception suivante, No Writable Property for TopStudents found in types Students

Suis-je manque quelque chose? S'il vous plaît partager une démo rapide ou un tutoriel. Il n'y a même pas une documentation appropriée où je peux trouver la cause de l'exception et la résoudre moi-même. Comment démarrer avec Dapper.Mapper?

+0

Votre requête renvoie uniquement 'Students', alors pourquoi avez-vous' TopStudents' comme argument de requête? Vous spécifiez les objets que dapper doit utiliser pour désérialiser la ligne. – markpsmith

+0

Ok laissez-moi le comprendre, le premier argument (objet 'Student') est la source dont la sortie je veux ** mapper ** au second argument (objet' TopStudents'). Cette compréhension n'est-elle pas correcte? Si non, veuillez me corriger. Merci –

+0

Cela signifie donc, ce deuxième paramètre à l'intérieur de '<' and '>' ne pas mapper le premier? Si j'aurais 4 jointures, il y aura 4 objets comme paramètres là-dedans? –

Répondre

1

Voir les documents here, l'exemple de requête utilise select * et utilise une jointure interne, il renvoie donc les objets Employee et Department. Si ce ne fut de retour des objets employés, le code ressemblerait à ceci:

var sql = @"select * from Employee"; 

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

Appliqué à votre code:

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

Si vous voulez retourner Students et TopStudents, alors vous changer à quelque chose comme:

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 maintenant je l'ai eu .. Je pensais que la sortie de la requête est mappée à 'Students' dont la propriété sérialisée correspond alors à' TopStudent'. Merci de clarifier :) –

+0

Juste une dernière requête: Quelle sera la variable type de 'studentRecord' dans votre réponse:' Students' ou 'TopStudents'? –

+0

'studentRecord' contiendra à la fois' Students' et 'TopStudents'. Je ne suis pas vraiment sûr de savoir pourquoi vous utiliseriez cette technique plutôt que de la mapper simplement à un modèle personnalisé. – markpsmith