FilterDTO, minimizando los métodos de nuestros DAO

Uno de los problemas que nos podemos encontrar a la hora de ir añadiendo métodos a nuestros DAO es que el níºmero de métodos que realizan consultas se dispare.
Por ejemplo, podemos tener un CocheDAO que permita operaciones de inserción, actualización y borrado, y además una serie de métodos que nos permitan hacer consultas sobre el mismo. Los métodos serí­an algo del estilo de:
GetCochesByMarca
GetCocheByMatricula
GetCochesByMarcaAndKilometraje
GetCochesByPais
La lista, interminable, íºnicamente limitada por la capacidad del cliente de pedir información.
Esto al final se vuelve un poco locura, el níºmero de métodos y el trabajo que lleva realizar cada uno de ellos se puede elevar hasta el infinito. ¿Existe solución?
Parece que sí­, si no, no estarí­amos aquí­ 🙂
Una solución al respecto es la de disponer de un íºnico método que sea capaz de devolver resultados para cualquier consulta planteada, pero, ¿cómo conseguirlo?
Ejemplo:
public CocheFilterDTO GetCochesByFilter(CocheFilterDTO filtro)
{
}
Este va a ser el método mágico que devolverá cualquier tipo de petición. El truco está en el parámetro que recibe, que en lugar de ser un DTO comíºn es un FilterDTO. La propiedad principal que definimos en un FilterDTO es la de que todas las propiedades que la componen son propiedades nullables (hemos hablado ya de nullables en otro post anterior). Es decir, podemos establecer con el valor null cualquiera de las propiedades definidas en el mismo.
La idea feliz se basa en que sólo vamos a filtrar por los valores del FilterDTO que no vengan a null. Por lo que si tengo en el FilterDTO una propiedad por cada uno de los elementos de filtro, voy a poder filtrar por todas y cada una de las combinaciones posibles. Sólo tengo que dar un valor a la propiedad y el método se encargará de filtrar. Si el valor está a null el método obviará el filtro por esa propiedad.
¿Cómo hacer esto? Muy sencillo, la condición SELECT que se llevará a cabo trabajará de la siguiente manera:
SELECT COCHE_CODIGO, COCHE_MATRICULA, MARCA_CODIGO, COCHE_KILOMETROS
FROM COCHE
WHERE (COCHE_CODIGO  = @CodigoCoche OR @CodigoCoche IS NULL) AND
                (COCHE_MATRICULA = @Matricula OR @Matricula IS NULL) AND
                (MARCA_CODIGO = @Marca OR @Marca IS NULL) …
Teniendo en cuenta que todo lo que empiezan por @ son los valores que vienen en el FilterDTO… ya tenemos la solución al problema. Si el valor viene en el parámetro se filtrará por él, si no viene se compará con NULL y dará true, por lo que será como si no se haya filtrado por esa caracterí­stica.
Entonces el chiste se resume en proveer al FilterDTO de todos los elementos que pueden venir o no rellenados y de definir la SELECT que trabaje con el mismo.
Idea feliz 🙂
Saludos.
Miguel.

2 thoughts on “FilterDTO, minimizando los métodos de nuestros DAO”

  1. O la idea que pueden hacer tambien es colocar :
    WHERE 1=1
    if FechaInicial is not null then
    ” AND FECHA_INICIAL = ” & FechaInicial.text
    end if
    if FechaFinal is not null then
    ” AND FECHA_FINAL = ” & FechaFinal.text
    end if
    Y ASI SE PUEDEN AHORRAR ALGUNAS ARTIMAí‘ANAS EXTRAS….SALUDOS.

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.