Dapper.net con una cantidad desconocida de elementos de la matriz

arrays dapper

Pregunta

Lo que intento hacer es tener un objeto de filtro que esté poblado como tal

var filter = new Filter
{
    ThingID = 1,
    Keywords = new[] { "op", "s" }
};

Y luego ser capaz de construir la consulta de esta manera:

var sb = new StringBuilder();
sb.AppendLine("select * from Stuff where 1=1");
if (filter.ThingID.HasValue)
{
    sb.AppendLine(" and ThingID = @ThingID");
}
if (filter.Keywords != null)
{
    for (int i = 0; i < filter.Keywords.Length; i++)
    {
        string keyword = filter.Keywords[i];
        if (!string.IsNullOrWhiteSpace(keyword))
        {
            sb.AppendLine(" and ( Model like '%' || @Keywords" + i + " || '%' )");
        }
    }
}
var sql = sb.ToString();
var results = Query<Stuff>(sql, filter).ToList();

Esto funciona bien si solo se llena el apuntador ThingID, pero hasta donde puedo decir, Dapper no está alimentando las palabras clave como un parámetro de ninguna manera. ¿Es esto posible con Dapper, o solo funciona en el contexto de "donde Palabras clave en @Keywords"?

Respuesta aceptada

Los parámetros deben coincidir por nombre; está agregando parámetros como @Keywords17 , pero no hay ninguna propiedad de Keywords17 17 para agregar. No interpreta eso como Keywords[17] , si eso es lo que quieres decir. Hay una cierta expansión automática de matrices planas, sino que está destinado a la ampliación in @Keywords (aunque la expansión en sí misma no es específica de in ). Actualmente no hay algo que lo ayude automáticamente allí; Sugeriría DynamicPaameters en DynamicPaameters lugar:

var args = new DynamicParameters();
args.Add("ThingID", 1);
...
if (!string.IsNullOrWhiteSpace(keyword))
{
    sb.AppendLine(" and ( Model like '%' || @Keywords" + i + " || '%' )");
    args.Add("Keywords" + i, keyword);
}
...
var cmd = new CommandDefinition(sql, args, flags: CommandFlags.NoCache);
var results = Query<Stuff>(cmd).AsList();

observe los sutiles dos cambios al final aquí - CommandFlags.NoCache ayudará a evitar crear muchas entradas de búsqueda para SQL similares pero diferentes (aunque puede optar por pagar esto para reducir el costo por artículo, depende de usted). AsList lugar de ToList evita una asignación de lista adicional.



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é