El método Dapper QueryMultiple () devuelve null de postgreSQL

c# dapper

Pregunta

Así que estoy tratando de ejecutar funciones pl/pgSQL desde una aplicación web utilizando Dapper micro-ORM . Siempre obtengo valores nulos independientemente de los valores que paso como parámetros en el método QueryMultiple ; aunque en la base de datos, la función da el resultado correcto.

Método DAL:

public List<JSONData> ExecutePostgres(string spName, List<QueryParam> Params)
    {
        List<JSONData> students = new List<JSONData>();

        using (var dbInstance = new NpgsqlConnection(postgreConnectionString))
        {
            using (var reader = dbInstance.QueryMultiple(spName, new { std_id = Params[0].value }, commandType: CommandType.StoredProcedure))
            {
                students = reader.Read<JSONData>().ToList();
            }
        }

        return students;
    }

Método de implementación:

public List<string> ExecuteProcedure(string spName, List<QueryParam> Params)
    {
        var list = objDLOperation.ExecutePostgres(spName, Params);
        var strList = new List<string>();

        list.ForEach(x => strList.Add(x.JSONResult));

        return strList;

    }

Esta strList es siempre una lista de valores null

Clase de entidad:

    public class JSONData
    {
      public string JSONResult { get; set; }
    }

Función pl / pgSQL:

CREATE OR REPLACE FUNCTION public.usp_getstudent(std_id integer)
RETURNS SETOF json 
AS $function$

BEGIN
RETURN QUERY
select row_to_json(result) from (select * from student where id = std_id) as result;
END  

$function$ LANGUAGE 'plpgsql';

Respuesta aceptada

Su columna parece ser un result nombre o ser anónimo, pero su tipo local tiene una propiedad llamada JSONResult . Dapper es quisquilloso con los nombres. Si haces que los nombres coincidan, debería funcionar bien. Sin embargo, francamente:

  • si solo está devolviendo una columna, no hay necesidad de una entidad, solo use <string> (esto también pasa por alto el problema de denominación, a dapper no le importan los nombres para las recuperaciones de una sola columna)
  • si solo está devolviendo una cuadrícula, no hay necesidad de QueryMultiple , solo use Query<T>

Como un punto muy secundario: .AsList() será más eficiente que .ToList() - evita cualquier copia adicional.

Personalmente, yo diría "devolver columnas escritas, no JSON", pero: eso depende de usted.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué