RuntimeBinderException sur requête massive
Question
Pourquoi est-ce que j'obtiens une exception de lieur d'exécution lorsque j'essaie d'exécuter la requête suivante dans Massive?
public dynamic Find(string email, string type)
{
dynamic result = new ExpandoObject();
result = this.Query(@"SELECT * FROM Addresses a
INNER JOIN Members m ON m.Id = a.MemberId
INNER JOIN AddressType at ON at.Id = a.AddressTypeId
WHERE m.Email = @0 AND at.Type = @1", new {email, type});
return result;
}
MODIFIER POUR AFFICHER LA SOLUTION: J'avais besoin de modifier ma requête pour m'assurer qu'une seule colonne avec le nom «Id» était renvoyée.J'obtenais une erreur contraignante car plusieurs colonnes dans Membres et adresses avaient une colonne nommée «Id».Pour obtenir un seul résultat dans ma requête, j'ai dû le modifier comme suit:
result = this.Query(@"SELECT a.* FROM Addresses a
INNER JOIN Members m ON m.Id = a.MemberId
INNER JOIN AddressType at ON at.Id = a.AddressTypeId
WHERE m.Email = @0 AND at.Type = @1", new object[] { email, type }).Single();
J'espère que cela aide quelqu'un d'autre.
La solution
Vous passez les arguments dans un objet anonyme, au lieu d'un tableau d'objets (params).Il devient donc le premier argument et ne parvient pas à se lier car votre requête attend 2 arguments.De plus, Query
renvoie le type IEnumerable<dynamic>
.
Modifiez votre code comme suit:
public dynamic Find(string email, string type)
{
IEnumerable<dynamic> result;
result = this.Query(@"SELECT a.* FROM Addresses a
INNER JOIN Members m ON m.Id = a.MemberId
INNER JOIN AddressType at ON at.Id = a.AddressTypeId
WHERE m.Email = @0 AND at.Type = @1", email, type);
// decide how you want to handle multiple results here
return result.FirstOrDefault();
}
Ou vous pouvez utiliser un tableau d'objets explicites:
WHERE m.Email = @0 AND at.Type = @1", new object[] {email, type});