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

C# Discussion :

Reflexion Sum Colonne avec delegate LinQ entity [Débutant]


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Octobre 2015
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2015
    Messages : 98
    Par défaut Reflexion Sum Colonne avec delegate LinQ entity
    Bonjour ,
    Je cherche à dynamiser un code que voici qui fonctionne très bien mais qui est incomplet (voir les annotations):

    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
     
     List<Tuple<string, int>> bioubou = new List<Tuple<string, int>>();  // une liste de tuple avec "nom de la colonne", "somme de la colonne" 
     
                    var zizouzi = from t in typeof(DiagTab).GetProperties() select t.Name;  // reflexion pour le nom de toute les colonnes de ma DB
                    List<string> essai = zizouzi.ToList(); // conversion en List        
     
                        for (int i = 2; i < essai.Count(); i++)  // "2" et pas 0 pour virer les 2ere colonne qui sont du texte 
                        {
                            DiagEntities db = new DiagEntities();    // appel de ma table edmx           
                            int lesion = db.DiagTabs.Sum(c => c.Vivant);
     
                            Label1.Text = essai[3]; // donne le nom de colonne 3 (juste pour le fun) 
                            var viri = Tuple.Create(essai[i], lesion);  // création d'un tuple avec le nom de la colonne "i" et la somme de la colonne "Vivant"
                            bioubou.Add(viri);  // mise dans la list de tuple
                        }
                    bouba.DataSource = bioubou; // affichage 
                    bouba.DataBind();
    Comme vous l'aurez sans doute deviné je souhaite afficher le nom de chaque colonne avec la somme qui va bien.
    Je n'arrive par a faire une reflexion sur la somme d'une colonne que je pourrait mettre dans mon expression lambda "lesion". Pour l'exemple j'ai mis l'expression lambda de la colonne Vivant de ma base mais j'aimerai avoir une expression generique.

    Voila si vous pouviez me filer un coup de pouce sur cette expression ou la façon d'atteindre par reflexion les valeurs d'une colonne afin que je tente un SUM dessus...
    Après je suis pas figé sur la lambda, si vous savez appeller la somme d'une colonne generique avec LinQ to entity ça me va

    merci de votre aide

  2. #2
    Membre confirmé
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Octobre 2015
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2015
    Messages : 98
    Par défaut
    Grace a un peu d'aide je suis passer à ceci :
    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
     
               {
                    Dictionary<string, int> dictionary = new Dictionary<string, int>();
                    using (var db = new DiagEntities())
                    {
                        PropertyInfo[] properties = typeof(DiagTab).GetProperties(); // On récupère toute la propriété
     
     
                        foreach (PropertyInfo property in properties)
                        {
     
                            string name = property.Name;
                            if (name == "ID_Diag") { continue; } // je vire les 2ère colonne qui sont des string
                            if (name == "Reponse") { continue; }
     
                            Func<DiagTab, int> accessor = (Func<DiagTab, int>)property.GetMethod.CreateDelegate(typeof(Func<DiagTab, int>));
     
     
                            int sum = db.DiagTabs.Sum(p => accessor(p));  //somme de la colonne dans le Name
     
     
                            dictionary.Add(name, sum);                       
                        }
                        bouba.DataSource = dictionary; //affichage sur la page 
                        bouba.DataBind();
                    }
    mais qui lève cette exception au lancement:
    Informations supplémentaires : Impossible d'établir une liaison avec la méthode cible, car sa signature ou sa transparence de sécurité n'est pas compatible avec celle du type délégué.

    J’avoue que je ne comprend pas cette erreur.

    Merci de votre aide

  3. #3
    Membre confirmé
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Octobre 2015
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2015
    Messages : 98
    Par défaut
    j'avance doucement et je suis a présent confronté à une nouvelle erreur plus difficile pour moi.
    voici le code modifié:
    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
     
    Dictionary<string, int> dictionary = new Dictionary<string, int>();
                    using (var db = new DiagEntities())
                    {
                        PropertyInfo[] properties = typeof(DiagTab).GetProperties(); 
     
     
                        foreach (PropertyInfo property in properties)
                        {
     
                            string name = property.Name;
                            if (name == "ID_Diag") { continue; }
                            if (name == "Reponse") { continue; }
     
     
     
     
                            Func<DiagTab, byte> accessor = (Func<DiagTab, byte>)property
                                                                                .GetMethod
                                                                                .CreateDelegate(typeof(Func<DiagTab, byte>));
     
     
                            int sum = db.DiagTabs.Sum(p => accessor(p));  // lève une erreur
     
     
                            dictionary.Add(name, sum);                       
                        }
                      bouba.DataSource = dictionary;
                        bouba.DataBind();
                       }
    l'erreur est: Le type de nœud 'Invoke' de l'expression LINQ n'est pas pris en charge dans LINQ to Entities.
    Donc bon la je seche un peu... il aime pas trop l'expression lambda de ce type visiblement
    Peut on modifier la requête ? LinQkit pourrait etre utile ici ?

    merci de votre aide

  4. #4
    Membre très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2007
    Messages : 871
    Par défaut
    Salut,

    de ce que je comprends ton object a des listes de int par exemple et tu voudrait faire la somme dessus:

    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
    Dictionary<string, int> dictionary = new Dictionary<string, int>();
    var src = new plop();
     
    var properties = src.GetType().GetProperties();
    foreach (var property in properties)
    {
        string name = property.Name;
        if (name == "ID_Diag") { continue; }
        if (name == "Reponse") { continue; }
     
        var value = property.GetValue(src);
        var castedValue = value as IEnumerable<int>;
     
        if(castedValue != null)
           dictionary.Add(name, castedValue.Sum());
    }
     
    bouba.DataSource = dictionary;
    bouba.DataBind();

    voila une version possible.

  5. #5
    Membre confirmé
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Octobre 2015
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2015
    Messages : 98
    Par défaut
    trouvé!
    bonjour la galère , j'était très loin du compte

    voici la solution:
    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
     
    foreach (var property in typeof(DiagTab).GetProperties())
    {    
        string name = property.Name;
        if (name == "ID_Diag") { continue; } // no column 1 and 2 
        if (name == "Reponse") { continue; } 
     
        // selector = (DiagTab source) => (int)source.Property
        var source = Expression.Parameter(typeof(DiagTab), "source");
        var selector = Expression.Lambda<Func<DiagTab, int>>(
            Expression.Convert(Expression.Property(source, property), typeof(int)),
            source);
     
       int sum = db.DiagTabs.Sum(selector);
       dictionary.Add(name, sum);                      
    }
    merci a tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Entetes de colonnes fixes dans une TABLE.
    Par laurent_diep dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 04/07/2007, 16h33
  2. Réponses: 3
    Dernier message: 19/07/2006, 14h28
  3. colonne calculée dans une vue
    Par jfc dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 19/04/2006, 16h11
  4. colonne affichée dans une liste déroulante
    Par Tierisa dans le forum Access
    Réponses: 4
    Dernier message: 13/10/2005, 16h13
  5. [SQL Server 2000] ajouter une colonne identité dans une vue?
    Par CetTer dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 02/08/2005, 13h43

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