IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET MVC Discussion :

Methodes de filtrage avec entity framework


Sujet :

ASP.NET MVC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de M_Makia
    Homme Profil pro
    dev
    Inscrit en
    Février 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : dev
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2008
    Messages : 121
    Par défaut Methodes de filtrage avec entity framework
    Bonjour à toutes et a tous,

    Je souhaiterais savoir qu'elles sont les méthodes que vous utilisez pour filtrer vos listes de données dans vos app MVC avec Entity framework.

    Avez-vous une methode de filtrage "générique" => filtrage dynamique ?

    Exemple : https://github.com/StefH/System.Linq.Dynamic.Core

    Une méthode ou vous rechercher une chaine dans tous les champs de tables?

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
            public List<Movie> GetMovies(FilteringParams filteringParams)
            {
                var query = this.movies.AsQueryable();
     
                var filterBy = filteringParams.FilterBy.Trim().ToLowerInvariant();
                if (!string.IsNullOrEmpty(filterBy))
                {
                    query = query
                           .Where(m => m.LeadActor.ToLowerInvariant().Contains(filterBy)
                           || m.Title.ToLowerInvariant().Contains(filterBy)
                           || m.Summary.ToLowerInvariant().Contains(filterBy));
                }
     
                return query.ToList();
            }
    Une méthode ou vous écrivez vous mème le "Where" (prédicat) en fonction des champs de recherche ?

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
            public List<Movie> GetMovies(string title, string summary, string leadActor)
            {
                var query = this.movies.AsQueryable();
     
                 if (!String.IsNullOrWhiteSpace(title)) query = query .Where(u => u.Title.Contains(title);
                 if (!String.IsNullOrWhiteSpace(summary)) query = query .Where(u => u.Summary.Contains(summary);
                 if (!String.IsNullOrWhiteSpace(leadActor)) query = query .Where(u => u.LeadActor.Contains(leadActor);
     
                return query.ToList();
            }
    Autres méthodes ?


    Je suis à la recherche d'une méthode la plus "propre" possible et également dynamique pour filtrer mes listes de données.
    J'ai pu voir pas mal de solutions à droite et a gauche mais rien ne ma semblé bien structuré et super productif ^^

    Je souhaiterais avoir vos avis sur la question.

    Je vous remercie.

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    en même temps EF c'est bien pour les débutants, rapidement on se rend compte que ce n'est pas performant (sur un petit projet ca passe, et là on a pas forcément besoin de choses comme du filtrage dynamique)
    ca pourrait expliquer que tu ne trouves rien de très concret ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre expérimenté Avatar de M_Makia
    Homme Profil pro
    dev
    Inscrit en
    Février 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : dev
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2008
    Messages : 121
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    en même temps EF c'est bien pour les débutants, rapidement on se rend compte que ce n'est pas performant (sur un petit projet ca passe, et là on a pas forcément besoin de choses comme du filtrage dynamique)
    ca pourrait expliquer que tu ne trouves rien de très concret ...
    Je suis d'accord avec toi sur le fait que Entity Framework est moins performant que de l'ADO.Net ou du Dapper par exemple mais la question n'est pas la pour moi.
    Je recherche de la productivité et pour moi dans 80% des cas Entity Framework est un bon compromis entre productivité et performance en ce qui concerne la couche d’accès au données.

    L'idée et de produire de petites et moyennes applications le plus rapidement possible en ayant une architecture applicative suffisamment générique et robuste pour que le code produit sois principalement du code à "haute valeur ajoutée" ( couche UI et Business ).

  4. #4
    Membre chevronné Avatar de WaterTwelve21
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2015
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2015
    Messages : 270
    Par défaut
    Bonjour ,

    Ayant un peu de temps libre, je me suis penché sur ce que tu recherches, mon code semble fonctionnel.

    De ce que j'ai compris, le but est d'avoir une méthode générique pour filter selon certaines propriétés de ton objet.

    J'ai créer une méthode d'extension pour y parvenir ( tout est expliqué dans les descriptions des méthodes) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    public static class ListHelpers
        {   
            /// <summary>
            /// Méthode générique pour filtrer une liste selon certaines propriétés
            /// </summary>
            /// <typeparam name="T"> Type de la collection </typeparam>
            /// <param name="source"> la collection </param>
            /// <param name="sRecherche">le libellé recherché</param>
            /// <param name="proprietes">les propriétés de l'objet concernées par le filtre</param>
            public static IEnumerable<T> Filtrer<T>(this IEnumerable<T> source,string sRecherche, params Func<T,string>[] proprietes)
            {
                if (!source.Any())
                    return Enumerable.Empty<T>();
     
                return source.Where(
                    obj =>
                        Contains(sRecherche,
                        proprietes.Where(f => f != null)
                        .Select(f => f(obj))
                        .ToArray()
                    )); 
            }
     
            /// <summary>
            /// Contains multiple : boucle sur les champs pour y trouver le libellé recherché
            /// </summary>
            /// <param name="sRecherche">le libellé recherché</param>
            /// <param name="champs">les champs à comparer</param>
            private static bool Contains(string sRecherche, params string[] champs )
            {
                bool contains = false;
     
                if (String.IsNullOrEmpty(sRecherche))
                    return contains;
     
                string sRechercheFormate = sRecherche.Trim().ToUpperInvariant();
     
                foreach (string champ in champs)
                {
                    string sChampFormate = champ.Trim().ToUpperInvariant();
                    if (sChampFormate.Contains(sRechercheFormate))
                    {
                        contains = true;
                        break;
                    }
                }
     
                return contains;
            }
        }
    Et appelé comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
                List<Movie> movies = new List<Movie>()
                {
                    new Movie(){ Title = "La vie est belle" , Summary = "En 1938, Guido, jeune homme plein de gaieté ... " , LeadActor = "Roberto Benigni"  },
                    new Movie(){ Title = "Fight Club" , Summary = "Fight Club raconte avec un montage visuel frénétique ... " , LeadActor = "Edward Norton" },
                    new Movie(){ Title = "Seven" , Summary = "Ce thriller lugubre nous plonge dans une atmosphère poisseuse ... " , LeadActor = "Brad Pitt" },
                    new Movie(){ Title = "Rencontre avec Joe Black" , Summary = "Une nuit le magnat William Parrish ressent une violente douleur  ... " , LeadActor = "Brad Pitt" }
                };
     
                List<Movie> moviesWithBradPitt = movies.Filtrer("Brad Pitt",m => m.LeadActor, m => m.Summary, m => m.Title).ToList();
    En espérant que cela te vienne en aide .

Discussions similaires

  1. EFCachingProvider avec Entity Framework 4 et des procédures stockées
    Par aymeric.lagier dans le forum Entity Framework
    Réponses: 2
    Dernier message: 08/07/2010, 19h53
  2. Pour instancier le context avec Entity Framework
    Par aboily dans le forum Entity Framework
    Réponses: 0
    Dernier message: 26/05/2010, 06h28
  3. Problème Ajout Donnée avec Entity Framework
    Par Invité dans le forum Linq
    Réponses: 4
    Dernier message: 14/10/2009, 14h16
  4. Pb de création de modéle avec entity framework
    Par rangdalf dans le forum Connexion aux bases de données
    Réponses: 2
    Dernier message: 25/06/2009, 22h34
  5. Probleme de connexion avec Entities Framework
    Par gstrit dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 09/06/2009, 09h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo