Lista de parámetros de construcción Dapper

c# dapper

Pregunta

Tengo esta clase:

public class Parameters
{
    public string UserId {get;set;}
    public string OrgId {get;set;}
    public string Roles {get;set;}
}

Se deserializa de una cadena JSON. Entonces algunas de las propiedades son null .

¿Cuáles son las mejores formas de crear la lista de parámetros para pasarla a Dapper?

Por el momento, mi lógica para construir la cadena de parámetros para etiquetar al final de la declaración SQL es la siguiente:

var parameters = string.Empty;
var parametersObj = new { };
if (query.Parameters != null)
{
    if (!string.IsNullOrWhiteSpace(query.Parameters.UserId))
    {
        parameters = string.Format("{0} UserId = @UserId", parameters);
        // parametersObj.UserId = 
    }

    if (!string.IsNullOrWhiteSpace(query.Parameters.OrganisationIdentifier))
    {
        parameters = string.Format("{0}, OrganisationIdentifier = @OrganisationIdentifier", parameters);
    }

    if (!string.IsNullOrWhiteSpace(query.Parameters.Roles))
    {
        parameters = string.Format("{0}, Roles = @Roles", parameters);
    }
}

var sqlString = string.Format("exec {0} {1}", query.DbObjectName, parameters);

conn.QueryAsync<dynamic>(sqlString, )

Como puede ver con los parametersObj , iba con la forma JavaScript de construir dinámicamente un objeto. Si hiciera esto con dynamic lugar de con un objeto, ¿funcionará?

ejemplo:

var parameters = string.Empty;
dynamic parametersObj = new { };
if (query.Parameters != null)
{
    if (!string.IsNullOrWhiteSpace(query.Parameters.UserId))
    {
        parameters = string.Format("{0} UserId = @UserId", parameters);
        parametersObj.UserId = query.Parameters.UserId;
    }

    if (!string.IsNullOrWhiteSpace(query.Parameters.OrganisationIdentifier))
    {
        parameters = string.Format("{0} OrganisationIdentifier = @OrganisationIdentifier ", parameters);
        parametersObj.OrganisationIdentifier= query.Parameters.OrganisationIdentifier;
    }

    if (!string.IsNullOrWhiteSpace(query.Parameters.Roles))
    {
        parameters = string.Format("{0} Roles = @Roles", parameters);
        parametersObj.Roles= query.Parameters.Roles;
    }
}

var sqlString = string.Format("exec {0} {1}", query.DbObjectName, parameters);

conn.QueryAsync<dynamic>(sqlString, parametersObj);

Respuesta aceptada

Creo que el segundo ejemplo funcionará cuando cambies

dynamic parametersObj = new {};

a

dynamic parametersObj = new ExpandoObject();

y la consulta a

conn.QueryAsync(sqlString, new 
{
    UserId = parametersObj.UserId,
    ...
};

NOTA: rellenar el objeto dinámico como

conn.QueryAsync(sqlString, parametersObj);

levantará el error

Los métodos de extensión no pueden enviarse dinámicamente


Respuesta experta

No necesita hacer nada: simplemente pase su objeto como los parámetros . Dapper solo pasará en propiedades / parámetros que puede identificar en la consulta ... e incluso si los pasa a todos: entiende nulo.

El objeto está bien.

...QueryAsync(sql, query.Parameters)...


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é