public List <Rol> getByQuery(String nombreRol, KeyValuePair <String, Boolean> estado, Funcionalidad funcionalidad) { List <Rol> roles = new List <Rol>(); String query = "SELECT r.idRol FROM LOS_BORBOTONES.Rol r"; //Consulta SIN FILTRO if (nombreRol.Equals("") && estado.Key == null && funcionalidad == null) { roles = this.getAll(); } else { //Consulta CON FILTROS //PREPARO TODO PARA HACER LA CONSULTA String connectionString = ConfigurationManager.AppSettings["BaseLocal"]; SqlConnection sqlConnection = new SqlConnection(connectionString); SqlCommand sqlCommand = new SqlCommand(); SqlDataReader reader; sqlCommand.CommandType = CommandType.Text; sqlCommand.Connection = sqlConnection; //Booleano que uso para armar bien la consulta Boolean primerCriterioWhere = true; //Consulta por FUNCIONALIDAD //Va primero porque el JOIN va antes que el WHERE if (funcionalidad != null) { sqlCommand.Parameters.AddWithValue("@Funcionalidad", funcionalidad.getDescripcion()); query = query + " INNER JOIN LOS_BORBOTONES.Funcionalidad_X_Rol fxr ON r.idRol = fxr.idRol INNER JOIN LOS_BORBOTONES.Funcionalidad f ON f.idFuncionalidad = fxr.idFuncionalidad WHERE f.Descripcion = @Funcionalidad"; primerCriterioWhere = false; } //AGREGO FILTRO NOMBRE if (!nombreRol.Equals("")) { if (primerCriterioWhere) { query = query + " WHERE r.Nombre LIKE @Nombre"; primerCriterioWhere = false; } else { query = query + " AND r.Nombre LIKE @Nombre"; } sqlCommand.Parameters.AddWithValue("@Nombre", "%" + nombreRol + "%"); } //AGREGO FILTRO ESTADO if (estado.Key != null) { if (primerCriterioWhere) { query = query + " WHERE r.Activo = @Estado"; primerCriterioWhere = false; } else { query = query + " AND r.Activo = @Estado"; } sqlCommand.Parameters.AddWithValue("@Estado", Convert.ToInt32(estado.Value)); } //HAGO LA CONSULTA sqlCommand.CommandText = query; sqlConnection.Open(); reader = sqlCommand.ExecuteReader(); //ARMAR ROLES while (reader.Read()) { roles.Add(this.getById(reader.GetInt32(reader.GetOrdinal("idRol")))); } sqlConnection.Close(); } return(roles); }