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

Linq Discussion :

Passer une variable anonyme en paramètre


Sujet :

Linq

  1. #1
    Expert confirmé Avatar de Barsy
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    1 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 484
    Points : 5 279
    Points
    5 279
    Par défaut Passer une variable anonyme en paramètre
    Bonjour,

    Je débute complétement dans l'utilisation de Linq et j'aurai besoin de votre aide pour me défaire d'un problème.

    Très simplement, mon code va lire les données d'une table dans une base de données et va les afficher dans un datagrid. Simplement, pour éviter que ce dernier n'affiche les 150 lignes de la table à l'écran, je décide de filtrer la requete par lots de 12 lignes que je fais varier via un système de pagination (je sais que la pagination est inclus de base dans le datagrid, mais là n'est pas le problème, je souhaite juste me perfectionner en Linq).

    Donc voilà mon premier code :

    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
    maBaseDeDonnees mabdd = new maBaseDeDonnees ();
     
    // Je vais lire les informations des personnes
    var listePersonnes = (from pers in mabdd.Personnes
    select new
    {
    Nom = " " + pers.PER_NOM,
    Prénom = " " + pers .PER_PRENOM,
    Email = " " + pers .PER_EMAIL,
    Adresse = " " + pers .PER_ADRESSE
    });
     
    // Je compte le nombre d'éléments retournés (pour la pagination)
    int nbElements = listeMPI.Count();
     
    // Je filtre sur les 12 premiers éléments
    var listeAffichee = (from list in listePersonnes
    select list).Take(12);
     
    // J'affiche dans le datagrid
    monDataGrid.DataSource = listeAffichee;
    monDataGrid.DataBind();
    Jusque là, tout marche très bien. Là où ça se complique, c'est que j'aimerai que les variables anonymes soient générés dans des fonctions annexes. C'est à dire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    maBaseDeDonnees mabdd = new maBaseDeDonnees ();
     
    // Je vais lire les informations des personnes
    var listePersonnes = lireListePersonne();
     
     
    // Je compte le nombre d'éléments retournés (pour la pagination)
    int nbElements = listeMPI.Count();
     
    // Je filtre sur les 12 premiers éléments
    var listeAffichee = filtreListe(listePersonnes, 12);
     
    monDataGrid.DataSource = listeAffichee;
    monDataGrid.DataBind();
    le problème c'est pour les fonction lireListePersonne et filtreListe. Je ne sais pas quel type ils doivent retourner (j'ai tenter IQueryable et IEnumerable mais ils ne marchent pas) et je ne sais pas non plus quel type doit prendre filtreListe en paramètre pour listePersonne.

    Voilà, si quelqu'un avait la solution, ça m'avancerai pas mal. merci.

    PS : Je ne sais pas si vous avez remarqué, mais dans ma première requête, j'ai été obligé de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select new
    {
    Nom = " " + pers.PER_NOM,
    Prénom = " " + pers .PER_PRENOM,
    Email = " " + pers .PER_EMAIL,
    Adresse = " " + pers .PER_ADRESSE
    }
    Pour que mon datagrid modifie les entêtes des colonnes. ça marche, mais si je veux mettre Code Postal, ça ne marche plus car il y a un espace. Comment faire pour modifier les noms des champs avec linq (sans toucher au datagrid) ?

  2. #2
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Points : 14 357
    Points
    14 357
    Par défaut
    Le fait de retourner un type anonyme n'est pas aussi simple et pour y arriver, il faut passer par les génériques.

    Tu trouveras les explications sur mon blog : http://blog.developpez.com/jerome?ti...nyme_en_vale_3

    Si tu as des questions, n'hésite pas.

  3. #3
    Expert confirmé Avatar de Barsy
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    1 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 484
    Points : 5 279
    Points
    5 279
    Par défaut
    Merci pour ta réponse

    Alors ça marche pour le return mais pas pour la variable passée en paramètre.

    je m'explique, maintenant j'ai ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var listeAffichee = Fonctions.castVariablesAnonymes(
                    filtreListe(),
                    from pers in mabdd.Personnes
                    select new
                    {
                        Nom = "",
                        Prénom = "",
                        Email = "",
                        Adresse = ""
                    });
    Le problème est que dans filtreListe, je n'arrive pas à passer listePersonnes en paramètre.

  4. #4
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Points : 14 357
    Points
    14 357
    Par défaut
    Désolé, je n'avais pas lu jusqu'au bout concernant les questions sur Linq.

    Pour passer un type anonyme à une méthode, c'est sensiblement le même principe. Faudra que je blog la dessus d'ailleurs

    Voici un petit exemple tout chaud :

    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
    public static void Test()
    {
        var anonymousInstance = new { Prop1 = "Value1", Prop2 = 2 };
        MyMethod(anonymousInstance);
    }
     
    public static void MyMethod(object anonymousInstance)
    {
        var instance = GenericCast(anonymousInstance, new { Prop1 = string.Empty, Prop2 = (int)0 });
    }
     
    public static A GenericCast<A>(object anonymousInstance, A type)
    {
        return (A)anonymousInstance;
    }

  5. #5
    Expert confirmé Avatar de Barsy
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    1 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 484
    Points : 5 279
    Points
    5 279
    Par défaut
    Oui, j'ai essayé comme ça, mais le problème est que mes données viennent d'une base de données et non d'une liste. ce qui me force à rajouter le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from pers in mabdd.Personnes
    avant le select.

    ça veut dire qu'il me faut à chaque fois déclarer "mabdd" sinon ça ne marche pas.

    D'autre part, j'aimerai ne pas avoir à coder le tout dans la même classe et ainsi que mon datagrid puisse afficher des tables différentes.

    J'aurais donc un code du style

    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
    class Personne
    {
    	protected maBaseDeDonnees mabdd = new maBaseDeDonnees ();
    
    	public Object listeTable()
    	{
    		var listePersonnes = (from pers in mabdd.Personnes
    		select new
    		{
    			Nom = "&nbsp;" + pers.PER_NOM,
    			Prénom = "&nbsp;" + pers .PER_PRENOM,
    			Email = "&nbsp;" + pers .PER_EMAIL,
    			Adresse = "&nbsp;" + pers .PER_ADRESSE
    		});
    		
    		return listePersonne;
    
    	}
    }
    
    class pageDataGrid
    {
    
    	protected DataGrid monDataGrid;
    	Personne pers = new Personne();
    
    	protected void Page_Load(object sender, EventArgs e)
    	{
    		var maListeComplete = GenericCast(pers.listeTable(), ?????)
    
    		var maListeFiltre = GenericCast(filtreElements(maListeComplete), ?????)
    
    		monDataGrid.DataSource = maListeFiltre;
    		monDataGrid.Bind();
    	}
    
    	protected Object filtreElements(Object listeComplete)
    	{
    		return (from list in listeComplete
    		select list).Take(12);
    	}
    
    	public static A GenericCast<A>(object anonymousInstance, A type)
    	{
    		return (A)anonymousInstance;
    	}
    
    }
    Voilà, j'ai mis des points d'interrogation en rouge aux endroits où je sèche. J'ai simplifié l'exemple mais normalement, mon dataGrid est simplement un objet dans une feuille ascx que je place dans un aspx et que je rempli avec la table voulue suivant l'aspx dans laquelle il se trouve.

    Le but bien évidemment est d'essayer d'avoir un semblant de code propre.

  6. #6
    Expert confirmé Avatar de Barsy
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    1 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 484
    Points : 5 279
    Points
    5 279
    Par défaut
    Finalement, je me suis débrouillé en transformant mon objet LINQ TO SQL en datatable et j'effectuer mes actions de filtre et de tri sur ma datatable en utilisant LINQ.

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/11/2013, 22h12
  2. Passer une variable en paramètre d'ouverture de fichier
    Par KiraX10A dans le forum Débuter
    Réponses: 5
    Dernier message: 12/01/2010, 15h30
  3. [MySQL] Passer une variable PHP comme paramètre JS
    Par baderahmed dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 29/08/2009, 16h00
  4. Réponses: 0
    Dernier message: 23/04/2009, 17h13
  5. Réponses: 1
    Dernier message: 17/07/2008, 17h41

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