Per Llorenç Carrera Mateu, Responsable de Projectes de Solucions a Mida
En el desenvolupament web d’avegades les funcionalitats que per defecte aporta una eina no són suficients per complir amb els requeriments d’un projecte. En aquests casos ens les hem d’enginyar per poder complir amb els requeriments sense que es vegi afectada la velocitat de desenvolupament.
Veurem en aquest post com hem desenvolupat un Helper que permet poder fer cerques sense tenir en compte els accents en taules de Telerik, cosa que sens dubte serà útil per a desenvolupadors que utilitzen aquesta UI en projectes asp.net en espanyol.
L’exemple que anem a mostrar és d’un projecte mvc en asp.net amb la base de dades SQL Server i amb les llibreries de Kendo Telerik per asp.net mvc. L’accés a base de dades es realitza amb Entity Framework.
Aquestes llibreries ens proporcionen una gran quantitat de components que faciliten el desenvolupament d’aplicacions amb la consegüent reducció en el temps d’implementació. Especialment, la grid permet realitzar filtres, ordenacions i altres funcionalitats que es poden implementar amb poc esforç.
En un projecte volíem que la recerca de textos no tingués en compte l’accent. Per exemple, si es filtra per una columna de poblacions i es busca “Malaga” ha de tornar les poblacions com “Málaga” independentment de si la paraula buscada porta o no porta accent.
La base de dades que utilitzem és SQL Server 2018. Aquesta base de dades es pot configurar perquè en les sentències no tingui en compte els accents en els caràcters. Això es fa configurant la base de dades perquè la “Collation” sigui “Accent Insensitive”. Fent això teòricament ja es podrien fer les recerques sense tenir en compte els accents, però les taules de Telerik no mostraven els resultats esperats ja que les funcions de filtre que tenen no suporten aquesta característica.
Abans de començar comentar que les taules de Telerik permeten realitzar filtres de tipus Excel. És a dir, per a cada columna podem fer una recerca:
Llavors havíem de poder accedir als valors que introdueix l’usuari en aquests filtres i fer alguna cosa amb ells que ens permetés realitzar les recerques Accent Insensitive.
L’objecte que ens retornava la petició amb els filtres que havia introduït l’usuari tenien una estructura d’arbre i els seus nodes són de tipus FilterDefinition. Havíem de recórrer aquest arbre i recuperar els valors d’aquests filtres. Per a això vam construir un Helper que ens permetia fer això amb una funció recursiva.
Aquí hi ha un punt important a comentar. Hem de modificar l’operador que ve al FilterDescriptor, ja que si no a més de fer la consulta sobre la base de dades Telerik també realitza el filtre, amb el que ens tornaria a passar que es tindrien en compte els accents. Per això posem l’Operator a IsNotEmpty. Això fa que visualment segueixi havent operador i que no afecti al total de resultats.
D’altra banda, havíem de saber quines columnes de la taula podien contenir filtres amb accents i com realitzar aquest filtre en Linq. Això s’ha de definir per a cada taula en la qual vulguem fer aquest tipus de cerca, de manera que per a cada taula hem de crear una funció que ens torni la llista de columnes en les que el filtre és de tipus String i poden portar accents.
El mètode GetListCriterios del Helper té 2 paràmetres d’entrada. D’una banda, la llista de “columnes” que té la nostra taula que poden portar accents. De l’altra, els filtres que té la petició que estem rebent. És a dir, els filtres que l’usuari està aplicant a la taula.
A l’arquitectura per capes que teníem en el projecte, ens tocava ara passar l’objecte lCriterios fins a la capa d’accés a dades i, un cop en aquesta capa, construir la consulta a la base de dades que, al tenir la configuració d’Accent Insensitive, tornarà els resultats esperats.
Creem llavors la classe genèrica GenericFilter que ens permetrà modificar la consulta de base de dades. El mètode Filter d’aquesta classe, al ser genèric, ens serveix sigui quina sigui la taula o l’objecte sobre el qual realitzarem la cerca.
També és important remarcar que estem modificant consultes Linq de forma dinàmica. Això ho hem aconseguit instal·lant el paquet Nuget System.Linq.Dynamic.Core, que permet fer consultes Linq de forma dinàmica.
En aquest mètode hem implementat les tres operacions de filtre que tenen els filtres en les taules de Telerik en la nostra aplicació: IsEqualTo, Contains i IsNotEqualTo. Per a cada operació afegim a la query seu filtre.
Ja només ens queda mostrar com cridem a aquesta funció des del DAO de la nostra aplicació.
Amb això hem aconseguit assolir l’objectiu que les taules de Telerik permetin realitzar les recerques sense tenir en compte els accents.