Por Llorenç Carrera Mateu, Responsable de Proyectos de Soluciones a Medida
En el desarrollo web a veces las funcionalidades que por defecto aporta una herramienta no son suficientes para cumplir con los requerimientos de un proyecto. En estos casos nos las hemos de ingeniar para poder cumplir con los requerimientos sin que se vea afectada la velocidad de desarrollo.
Veremos en este post cómo hemos desarrollado un Helper que permite poder realizar búsquedas sin tener en cuenta los acentos en tablas de Telerik, algo que sin duda será útil para desarrolladores que utilizan esta UI en proyectos asp.net en español.
El ejemplo que vamos a mostrar es de un proyecto mvc en asp.net con la base de datos SQL Server y con las librerías de Kendo Telerik para asp.net mvc. El acceso a base de datos se realiza con Entity Framework.
Estas librerías nos proporcionan una gran cantidad de componentes que facilitan el desarrollo de aplicaciones con la consiguiente reducción en el tiempo de implementación. En especial, la grid permite realizar filtros, ordenaciones y otras funcionalidades que se pueden implementar con poco esfuerzo.
En un proyecto queríamos que la búsqueda de textos no tuviera en cuenta la tilde. Por ejemplo, si se filtra por una columna de poblaciones y se busca “Malaga” tiene que devolver las poblaciones como “Málaga” independientemente de si la palabra buscada lleva o no lleva tilde.
La base de datos que utilizamos es SQL Server 2018. Esta base de datos se puede configurar para que en las sentencias no tenga en cuenta las tildes en los caracteres. Esto se hace configurando la base de datos para que la “Collation” sea “Accent Insensitive”. Haciendo esto teóricamente ya se podrían hacer las búsquedas sin tener en cuenta los acentos, pero las tablas de Telerik no mostraban los resultados esperados ya que las funciones de filtro que tienen no soportan esta característica.
Antes de empezar comentar que las tablas de Telerik permiten realizar filtros de tipo Excel. Es decir, para cada columna podemos hacer una búsqueda:
Entonces debíamos poder acceder a los valores que introduce el usuario en estos filtros y hacer algo con ellos que nos permitiera realizar las búsquedas Accent Insensitive.
El objeto que nos devolvía la petición con los filtros que había introducido el usuario tenían una estructura de árbol cuyos nodos son del tipo FilterDefinition. Debíamos recorrer este árbol y recuperar los valores de estos filtros. Para ello construimos un Helper que nos permitía hacer esto con una función recursiva.
Aquí hay un punto importante a comentar. Tenemos que modificar el operador que viene en el FilterDescriptor, ya que si no además de realizar la consulta en base de datos Telerik también realiza el filtro, con lo que nos volvería a pasar que se tendrían en cuenta los acentos. Para ello ponemos el Operator a IsNotEmpty. Esto hace que visualmente siga habiendo operador y que no afecte en el total de resultados.
Por otro lado, debíamos saber qué columnas de la tabla podían contener filtros con acentos y cómo realizar este filtro en Linq. Esto se tiene que definir para cada tabla en la que queramos hacer este tipo de búsqueda, con lo que para cada tabla tenemos que crear una función que nos devuelva la lista de columnas en las que el filtro es de tipo String y pueden llevar tildes.
El método GetListCriterios del Helper tiene 2 parámetros de entrada. Por un lado, la lista de “columnas” que tiene nuestra tabla que pueden llevar acentos. Por otro, los filtros que tiene la petición que estamos recibiendo. Es decir, los filtros que el usuario está aplicando a la tabla.
En la arquitectura por capas que teníamos en el proyecto, nos tocaba ahora pasar el objeto lCriterios hasta la capa de acceso a datos y, una vez en esta capa, construir la consulta a la base de datos que, al tener la configuración de Accent Insensitive, devolverá los resultados esperados.
Creamos entonces la clase genérica GenericFilter que nos permitirá modificar la consulta de base de datos. El método Filter de esta clase, al ser genérico, nos sirve sea cual sea la tabla o el objeto sobre el que vamos a realizar la búsqueda.
También es importante remarcar que estamos modificando consultas Linq de forma dinámica. Esto lo hemos conseguido instalando el paquete Nuget System.Linq.Dynamic.Core, que permite hacer consultas Linq de forma dinámica.
En este método hemos implementado las tres operaciones de filtro que tienen los filtros en las tablas de Telerik en nuestra aplicación: IsEqualTo, Contains y IsNotEqualTo. Para cada operación añadimos a la query su filtro.
Ya solo nos queda mostrar cómo llamamos a esta función desde el DAO de nuestra aplicación.
Con esto hemos conseguido alcanzar el objetivo de que las tablas de Telerik permitan realizar las búsquedas sin tener en cuenta los acentos.