J'ai un objet comme le suivant et je voudrais l'envoyer comme paramètre pour une requête Dapper.
var person = new {
Name = "John",
Company = new {
Name = "ACME"
}
};
var res = connection.Query("select concat(@Name, @Company_Name) as concatted", person);
Mon problème est que @Company_Name
n'est pas utilisé. J'ai essayé de le remplacer par @Company.Name
, mais cela a donné une AggregateException, avec une SystemNotSupportedException: The member Company of type ..... cannot be used as a parameter value
.
Quelle est la bonne façon d'utiliser l'objet imbriqué de l'objet param passé dans la requête?
Vous devrez faire correspondre les noms des paramètres de requête dans votre objet param:
var res = conn.Query("select concat(@Name, @Company_Name) as concatted",
new { person.Name, Company_Name = person.Company.Name });
Edit: Non, vous ne pouvez pas passer l'objet tel qu'il est car Dapper fait un mappage sql-param très simple vers un paramètre d'objet.
Il doit être de type: IDynamicParameters
, IEnumerable<KeyValuePair<string, object>>
ou un objet anonyme où les valeurs de paramètre sont évaluées en fonction du nom des littéraux de paramètre sql. Voir https://github.com/StackExchange/Dapper/blob/a18dc63c688b5173c5dde8b1243b74e26fa262c4/Dapper/SqlMapper.cs#L2367 sur la façon dont son implémentation.