Pasar un parámetro de búsqueda de texto completo con Dapper.net

dapper full-text-search sql-server

Pregunta

Considere esta simple consulta que utiliza la búsqueda de texto completo en el campo Keywords :

DECLARE @searchTerm VARCHAR(500) = 'painted'
SELECT * FROM StockCatalogueItems
WHERE (CONTAINS(KeyWords, @searchTerm))

Esto funciona como se esperaba, pero necesito hacer lo mismo usando una consulta parametrizada de Dapper.net. Cuando uso procedimientos almacenados, creo el parámetro de texto completo como este: "\"painted*\""

Pero utilizando el mismo enfoque, esto no funciona usando dapper. No se devuelven resultados Esta es la línea en la consulta donde utilizo el parámetro:

AND (CONTAINS(KeyWords, @search)) 

y se pasa a la consulta así:

return _context.Database.Connection.Query<StockProfileMatrix>(basequery, new
{
    search = searchTerm
}

Solo puedo suponer que Dapper está desinfectando la cadena de alguna manera, quitando citas quizás?

¿Algunas ideas?

Respuesta aceptada

Para completar, responderé la pregunta. La sintaxis de la consulta es correcta, pero la forma en que se crea el parámetro de texto completo obviamente no. Creé un método de extensión que formatea el parámetro:

 public static string ToFullText(this string str)
 {
      string searchTerm = null;
      if (!string.IsNullOrEmpty(str))
      {
          string[] keywords = str.Trim().Split(null);
          foreach (var keyword in keywords)
          {
             searchTerm += string.Format("\"{0}*\" AND ", keyword);
           }
           if (searchTerm != null)
              searchTerm = searchTerm.Substring(0, searchTerm.LastIndexOf(" AND "));
        }
        return searchTerm;
  }

Luego invoco el método cuando paso el parámetro a la consulta de dapper:

_context.Database.Connection.Query<dynamic>(query, new 
{ 
    search = filter.SearchTerm.ToFullText()
});

Respuesta popular

Esto funciona para mí Sin embargo, la tecnología en la que estoy trabajando es .net core RTM y "Dapper": "1.50.0-rc3" ,

_dbConnection.QueryAsync<Guid>(@"select br.Id from Brand br where CONTAINS(br.Text,@Name)",new {Name = $"\"*{name}*\""}))


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é