Pregunta

¿Por qué recibo una excepción de aglutinante de tiempo de ejecución al intentar ejecutar la siguiente consulta en masivo?

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

Editar para mostrar la solución: necesitaba cambiar mi consulta para asegurar que solo se devolviera una columna con el nombre 'ID'. Estaba recibiendo un error vinculante porque varias columnas en miembros y direcciones tenían una columna llamada 'ID'. Para obtener un solo resultado en mi consulta, tuve que modificarla a esto:

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();

Espero que esto ayude a alguien más.

¿Fue útil?

Solución

Está pasando los args en un objeto anónimo, en lugar de una matriz de objetos (parámetros). Por lo tanto, se convierte en el primer argumento y no se une, ya que su consulta espera 2 argumentos. Además Query Tipo de devolución IEnumerable<dynamic>.

Cambie su código a esto:

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();
}

O puede usar una matriz de objetos explícito:

        WHERE m.Email = @0 AND at.Type = @1", new object[] {email, type});
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top