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 :

Remplacer les valeurs en table par les valeurs d'un tableau


Sujet :

Linq

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Remplacer les valeurs en table par les valeurs d'un tableau
    Bonjour,

    Je m'essais à Linq depuis quelques jours et après avoir consulter plusieurs exemple c'est intuitivement que j'ai réaliser le code suivant. Le but est que "Status" renvoi soit "Inactif" ou "Actif" si "se.Status" vaut 0 ou 1.

    Code C#
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    String[] etats = { "Inactif", "Actif" };
     
    var selectEnvironnements =
       from se in nadc.Environnements
       select new
       {
            Code = se.Code,
            Category = se.Category,
            Status = etats[se.Status]
       };
     
    tblEnvironnement.DataSource = selectEnvironnements;
    tblEnvironnement.DataBind();
    se.Code renvoi une string
    se.Category renvoi une string
    se.Status renvoi un int (0 ou 1)

    malheureusement ce code me renvoi l'erreur suivante :
    Noeud d'expression non reconnu : ArrayIndex

    Description : Une exception non gérée s'est produite au moment de l'exécution de la demande Web actuelle. Contrôlez la trace de la pile pour plus d'informations sur l'erreur et son origine dans le code.

    Détails de l'exception: System.InvalidOperationException: Noeud d'expression non reconnu : ArrayIndex

    Erreur source:
    Ligne 45 : tblEnvironnement.DataSource = selectEnvironnements;
    Ligne 46 : tblEnvironnement.DataBind();
    Pourtant :
    - Si je remplace : Status = etats[se.Status] par Status = se.Status ça me renvoi bien 0 ou 1
    - Si je remplace : Status = etats[se.Status] par Status = etats[0] ça me renvoi bien "Inactif"
    - Si je remplace : Status = etats[se.Status] par Status = etats[1] ça me renvoi bien "Actif"

    Pourquoi dans mon cas cela ne fonctionne pas, et quelle est la meilleur façon de remplacer à la volé une valeur stocké en base de donnée par une autre ?

    Merci d'avance pour vos explications.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Je suppose que tu parles de Linq to SQL ou Linq to Entities ? Parce que Linq (tout court) est juste une fonctionnalité du langage, ce n'est pas lié spécifiquement aux bases de données... donc il vaut mieux préciser.

    Avec Linq to SQL ou Linq to Entities, les expressions Linq sont converties en SQL pour être exécutées sur la base de données, ce qui fait qu'on ne peut pas écrire n'importe quoi dans une requête : il faut que ce soit traduisible en SQL. Et un accès à un tableau qui n'existe que dans ton code C# n'est évidemment pas traduisible en SQL...

    Tu pourrais modifier ton code pour utiliser, par exemple, l'opérateur conditionnel :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var selectEnvironnements =
       from se in nadc.Environnements
       select new
       {
            Code = se.Code,
            Category = se.Category,
            Status = se.Status == 0 ? "Inactif" : "Actif"
       };

    Ce qui se traduit en SQL par une instruction "CASE... WHEN"

    Evidemment cette solution marche dans ce cas précis parce qu'il n'y a que 2 valeurs (en fait ça pourrait marcher pour n'importe quel nombre FINI de valeurs). Si tu ne sais pas à l'avance combien de valeurs de statut existent, il faut faire autrement, par exemple avec une jointure sur une table qui contient les status possibles

    Autre chose : ta requête Linq renvoie un IQueryable, c'est ce qui fait qu'elle est exécutée sur la base de données. Mais tu peux aussi forcer le traitement à s'effectuer dans ton programme C# au fur et à mesure que tu récupères les données, ce qui permet d'exécuter n'importe quel code C# valide : il faut pour cela convertir ta requête en IEnumerable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    String[] etats = { "Inactif", "Actif" };
    var selectEnvironnements =
       from se in nadc.Environnements.AsEnumerable()
       select new
       {
            Code = se.Code,
            Category = se.Category,
            Status = etats[se.Status]
       };
    note le .AsEnumerable() après nadc.Environments

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Merci d'avoir pris le temps de me répondre, tout ceci semble plus clair.

    J'ai testé les deux solutions, elles fonctionnent.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    n'oublie pas le bouton alors
    (en bas de la page)

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

Discussions similaires

  1. Réponses: 31
    Dernier message: 23/12/2013, 14h41
  2. Réponses: 1
    Dernier message: 25/02/2010, 14h02
  3. [RegEx] Remplacement d'une chaine entre { } par une valeur
    Par phpiste dans le forum Langage
    Réponses: 13
    Dernier message: 08/02/2008, 22h35
  4. remplacer un "no rows selected" par une valeur
    Par awalter1 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/09/2007, 13h25
  5. Accès aux tables par les users
    Par BRUN NICOLAS dans le forum Sécurité
    Réponses: 2
    Dernier message: 13/02/2007, 10h58

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