Bonjour,

J'ai rencontré pas mal de fois un même cas de figure donc je me suis dis qu'il devait y avoir une best practice voir un pattern.

En effet, il n'est pas rare d'avoir une source de donnée (ex: une base de donnée) et de devoir filtrer un resultat (ex: requête sql/linq) selon des paramètres( ex: champs, colonnes) variables et dynamique, on peut également vouloir afficher le résultat en affichant que certains attributs.

Prenons un exemple concret.

On a une gridview et une série de filtre sur chaque champ de la base de données. Les filtres peuvent être utilisés ou non.

Typiquement le code ressemble à ceci :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
string request = " SELECT FieldA, FieldB, ... FROM TABLE WHERE ";
            if (!string.IsNullOrEmpty(field1))
                requete += String.Format(" FIELDA  = {0}", field1);
            if (!string.IsNullOrEmpty(field2))
                requete += String.Format(" FIELDB  = {0}", field2);
....
La gestion du WHERE peut vite devenir compliqué avec les ET et les OU. Pareil pour rendre le SELECT dynamique en fonction des champs que l'on veut voir.
La gestion de se long string qui est la requête est affreuse et difficilement maintenable pour les grosses requetes

De mon expérience, j'aurai tendance à créer une classe TableSelector, de manière à rendre ca plus facilement maintenant

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
    class TableSelector
    {
        private EnumerableRowCollection<DataRow> _queryLINQ; // dans le cas de linq
        private string _querySQL;// dans le cas de sql
 
        public void AddFilter(string column, string value)
        {
            _queryLINQ = from x in Tables where x.fields[column] = value;
        }
 
        public List<> GetResult(Array<string> column)
 
    }

J'aimerais connaitre votre façon de faire, vos avis, si vous avez des discussions ou des blogs la dessus etc ...

Merci :-)