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 :

DefaultIfEmpty() et valeur Nulle


Sujet :

Linq

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2014
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Janvier 2014
    Messages : 42
    Points : 35
    Points
    35
    Par défaut DefaultIfEmpty() et valeur Nulle
    Bonjour tout le monde,

    Bonne année 2017. Plein de bonnes choses et de projets gratifiants.

    J'ai un soucis. Lorsque je passe cette requete linq sur mes datatables, j'ai un message d'erreur :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    IList<PourCount> tp = (from t in (from t in tbl_TP.AsEnumerable()
                                        join t0 in tbl_traitement_gapp.AsEnumerable() on t.Field<string>("Identifiant demande") equals t0.Field<string>("Identifiant demande") into t0_join
                                        from t0 in t0_join.Where(p=>p.Field<string>("Identifiant demande") == null).DefaultIfEmpty()
                                        select new 
                                        {
                                            Dummy = "x"
                                        })
                                        group t by new { t.Dummy } into g
                                        select new PourCount
                                        {
                                            total = g.Count()
                                        }
                                        ).ToList();

    Message d'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    La valeur ne peut pas être null.
    Nom du paramètre : row
    Le systeme bloque sur la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from t0 in t0_join.Where(p=>p.Field<string>("Identifiant demande") == null).DefaultIfEmpty()
    Ce qui signifie que la cellule de la colonne "Identifiant Demande" est nulle et qu'il refuse de la lire.

    Auriez-vous un moyen de contournement ?

    Merci d'avance de vos avis éclairés

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Si on se refere a la documentation de DataRowExtensions.Field<T> Method (DataRow, String), il est ecrit dans les remarques que les objets DataSet ne supportent pas la valeur null. C'est du au fait que DataSet remplace les valeurs null par des valeurs de type DBNull.

    Donc soit tu te debarasses de la valeur null qui traine dans tes donnees, soit tu n'utilises plus de DataSet. Je te conseille d'envisager la solution #2 car les DataSet font partie de la prehistoire de .NET et ils sont tres lourds ! Ils embarquent tout un tas de fonctionnalites dont tu n'as pas besoin en general. Ils ont ete crees quand les listes et autres collections n'existaient pas dans le .NET Framework. Il vaut mieux utiliser des listes car elles sont beaucoup plus legeres qu'un DataSet et sont plus simples a utiliser.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2014
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Janvier 2014
    Messages : 42
    Points : 35
    Points
    35
    Par défaut
    Bonjour,

    Merci de ton retour

    Je n'utilise pas de DataSet mais des DataTables. 6 pour être plus précis. Celà rentre dans ton diagnostic ?

    Je convertis les résultats de mes requêtes Linq en IList<object>.

    Voici une requête linq qui ne fonctionne pas :

    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
     
     
    IList<InsertGapp> query = (from t in tbl_contrats.AsEnumerable()
                                 join t0 in tbl_TP.AsEnumerable()
                                 on t.Field<string>("Emplacement") equals t0.Field<string>("N° Site")
                                 join t1 in tbl_traitement_gapp.AsEnumerable() on t0.Field<string>("Identifiant TâChe") equals t1.Field<string>("Identifiant TâChe") into t1_join
                                 from t1 in t1_join.DefaultIfEmpty()
                                 where t1.Field<int?>("Identifiant TâChe") == null
                                 join t2 in tbl_multiIntervenants.AsEnumerable() on t1.Field<string>("Identifiant TâChe") equals t2.Field<string>("Identifiant TâChe") into t2_join
                                 from t2 in t2_join.DefaultIfEmpty()
                                 where t2.Field<int?>("Identifiant TâChe") == null
                                 select new InsertGapp
                                 {
                                     societe = t0.Field<string>("SociéTé"),
                                     region = t0.Field<string>("RéGion"),
                                     num_site = t0.Field<string>("N° Site"),
                                     nom_site = t0.Field<string>("Nom Site"),
                                     idInter = t0.Field<string>("Identifiant Intervention"),
                                     gammeInter = t0.Field<string>("Gamme Intervention"),
                                     idTache = t2 == null ? String.Empty : "test",
                                     desc = t0.Field<string>("Description"),
                                     etat = t0.Field<string>("Etat administratif intervention"),
                                     dateDebut = t0.Field<string>("Date DéBut PréVu tâChe"),
                                     dateFin = t0.Field<string>("Date Fin PréVu tâChe"),
                                     detrompeur = t0.Field<string>("Detrompeur"),
                                     demandeur = t0.Field<string>("Entité Demandeur"),
                                     infosDemandeur = t0.Field<string>("Infos Demandeur"),
                                     indicAccompagnement = t0.Field<string>("Indicateur Accompagnement"),
                                     codeJournalier = t0.Field<string>("Code Journalier"),
                                     coupure = t0.Field<string>("Coupure"),
                                     valide = t0.Field<string>("Validé ?"),
                                     accompagnement = t0.Field<string>("Accompagnement ?"),
                                     observateur = t0.Field<string>("Observation ?"),
                                     acces = t0.Field<string>("AccèS"),
                                     contrainte = t0.Field<string>("Contrainte de séCurité"),
                                     couleur = t0.Field<string>("V_Couleur"),
                                     Sensibilite = t1.Field<string>("Sensibilité Du site"),
                                     appAuto = t1.Field<string>("Approbation Automatique AS"),
                                     ChefDeProjets = t0.Field<string>("Chef De Projet SFR"),
                                     nom_prenom_intervenant = t0.Field<string>("Nom - prénom intervenant"),
                                     iddemande = t0.Field<string>("Identifiant Demande"),
                                     planPrevention = t0.Field<string>("PlanPrevention"),
                                     appartenace = t1.Field<string>("Appartenance")
                                 }).ToList();
    J'ai toujours ce message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    La valeur ne peut pas être null.
    Nom du paramètre : row
    Saurez vous m'expliquer ce qui est mauvais et ce qui est correct ?

    Merci d'avance

  4. #4
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Farid_developpement Voir le message
    Je n'utilise pas de DataSet mais des DataTables. 6 pour être plus précis. Celà rentre dans ton diagnostic ?
    Oui, il faut inclure tout ce qui rentre dans la composition d'un DataSet (DataSet, compose de DataTables, composees de DataRow/DataColumns, etc.), sans exception.

    Citation Envoyé par Farid_developpement Voir le message
    J'ai toujours ce message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    La valeur ne peut pas être null.
    Nom du paramètre : row
    Saurez vous m'expliquer ce qui est mauvais et ce qui est correct ?
    Si meme apres avoir supprime les valeurs null tu as toujours ce message alors tu connais la solution : revois ta solution sans DataSet.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

Discussions similaires

  1. requete avec la valeur NULL
    Par Hinkel dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 12/11/2008, 16h39
  2. Passer une valeur Null dans un argument de procédure
    Par preempalver dans le forum VBA Access
    Réponses: 5
    Dernier message: 30/12/2003, 20h52
  3. Selectionner un champ de valeur nulle
    Par arcane dans le forum Requêtes
    Réponses: 2
    Dernier message: 30/09/2003, 14h26
  4. [CR9] conversion de valeurs NULL
    Par ministry dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 12/09/2003, 11h41
  5. Valeurs Nulles ou Valeurs à Zéro
    Par LLaurent dans le forum XMLRAD
    Réponses: 5
    Dernier message: 30/07/2003, 11h40

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