¿Cómo creo una consulta dinámica de sql con Dapper.SqlBuilder y OrWhere?

dapper sqlbuilder

Pregunta

Estoy intentando construir una consulta SQL dinámica para múltiples términos de búsqueda. En general, entiendo cómo usar el generador, pero no estoy seguro de qué hacer en el ciclo ya que realmente necesito que @term sea diferente cada vez (creo). No solo en la consulta, sino también en el tipo anónimo para que coincida.

Podría usar una cadena.Formato en la cadena de consulta, pero no estoy seguro de cómo hacer coincidir en el tipo anónimo?

public async Task<List<Thing>> Search(params string[] searchTerms)
{
    var builder = new SqlBuilder();
    var template = builder.AddTemplate("SELECT * /**select**/ from ThingTags /**where**/ ");

    for (int i = 0; i < searchTerms.Length; i++)
    {
        builder.OrWhere("value LIKE @term", new { term = "%" + searchTerms[i] + "%" });
    }
...
}

en la forma actual, la consulta que se crea para los términos "abc", "def", "ghi" es

CommandType: Text, CommandText: SELECT *  from ThingTags WHERE  ( value LIKE @term OR value LIKE @term OR value LIKE @term ) 

Parameters:
Name: term, Value: %ghi%

Respuesta popular

Bueno, aquí hay una forma de hacer la creación de consultas. No me di cuenta de que los parámetros podrían ser un diccionario inicialmente.

public async Task<List<Thing>> Search(params string[] searchTerms)
{
var builder = new SqlBuilder();
var template = builder.AddTemplate("SELECT * /**select**/ from ThingTags /**where**/ ");

    for (int i = 0; i < searchTerms.Length; i++)
    {
        var args = new Dictionary<string, object>();
        var termId = string.Format("term{0}", i.ToString());
        args.Add(termId, "%" + searchTerms[i] + "%");
        builder.OrWhere("value LIKE @" + termId, args);
    }
...
}


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é