Linq & nullable

Signaler
Messages postés
70
Date d'inscription
jeudi 26 juillet 2007
Statut
Membre
Dernière intervention
20 janvier 2011
-
Messages postés
70
Date d'inscription
jeudi 26 juillet 2007
Statut
Membre
Dernière intervention
20 janvier 2011
-
Bonjour,

Je suis sûr du Linq en ce moment et ca me pose quelques soucis. je suis sur que vous allez savoir comment faire.

Voici ma requete linq :
var suivi = from c in dao.Users
select new
{
prenomNom = c.Prenom + " " + c.Nom,
enregistrement c.Avenants.Sum(d> d.MontantAffaire),
devisEnCours = (from e in dao.Devis
where e.DelegueeA == c.DelegueA
select e.Montant).Sum(),
objectif = c.ObjectifEnregistrement.Value
};

Donc, j'ai des sous requetes ou je fait juste des Sum. Malheureusement, ce sont des valeurs qui peuvent etre null. Du coup j'ai ce message :
'La valeur null ne peut pas être assignée à un membre de type System.Decimal, car il s'agit d'un type valeur non nullable.'

Comment faire pour ne pas que cela plante et marquer 0 quand c'est null ?

Merci des aides

10 réponses

Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
57
Bonsoir,
En principe ça doit marcher "sans rien faire":

float?[] points = {
null, 0, 92.83F,
null, 100.0F, 37.46F, 81.1F };

float? sum = points.AsQueryable().Sum();

Console.WriteLine(
"Total points earned: {0}", sum);
(exemple MSDN)

<hr />
-Blog-
-Site Perso-
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
64
Hello,

Je pense qu'une de tes variables enregistrement ou devisEnCours n'est pas nullable.
Si une des sommmes ne trouve que des valeurs nulles, elle retournera null aussi.
Pour changer ça, tu peux faire un GetValueOrDefault après le Sum, et ça devrait marcher.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
Messages postés
70
Date d'inscription
jeudi 26 juillet 2007
Statut
Membre
Dernière intervention
20 janvier 2011

Yop !

C'est exactement ca, toutes les valeurs sont null du coup, il retourne null (ce qui est logique). le GetValueOrDefault me semble donc parfait !
Malheureusement quand je le met apres mon Sum VS me dit : 'cannot resolve symbole GetValueOrDefault' (le controle espace ne connait pas non plus).

Alors j'ai cherché si ne n'etait pas ma requete qui sera mal tourné qui fait que cela ne marche pas, mais non, rien à faire. Ca marche pas.

Il faut ajouter des references pour que GetValueOrDefault fonctionne ? ou j'ai raté un truc ?

Merci :)
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
49
Salut

Une autre solution (système D) consisterait à faire un truc du genre (dans ta requête linq) :var machin from bidule in source.table select new { monDouble (bidule.monDouble != null) ? bidule.monDouble.Value : 0 };

Je ne garantis rien, mais ça ne coûte rien d'essayer...

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
57
J'ai toujours pas compris le problème...
Si je fais:

float?[] points = {
null,
null,
null,
null,
null };

float? sum = points.Sum();

sum = 0, non ?

<hr />
-Blog-
-Site Perso-
Messages postés
70
Date d'inscription
jeudi 26 juillet 2007
Statut
Membre
Dernière intervention
20 janvier 2011

Re,

En faite mon probleme c'est plutot :

float?[] points = { }; // Donc rien du tout
float? sum = points.Sum();

Console.WriteLine(sum);

Mais, dans le cas que tu donnes et dans celui que je donne le résultat est bien 0. Cela marche donc tres bien.

Mais dans mon vrai cas... ca marche pas.

Je vous rappel ma requete :
var suivi = from c in dao.Users
where c.ObjectifEnregistrement != null
select new
{
prenomNom = c.Prenom + " " + c.Nom,
enregistrement c.Avenants.Sum(d> d.MontantAffaire),
devisEnCours = (from e in dao.Devis
where e.DelegueeA == c.DelegueA
select e.Montant).Sum(),
devispondere = (from e in dao.Devis
where e.DelegueeA == c.DelegueA
select e.MontantPondere).Sum(),
objectif = c.ObjectifEnregistrement
};
Messages postés
70
Date d'inscription
jeudi 26 juillet 2007
Statut
Membre
Dernière intervention
20 janvier 2011

Désolé, mes messages sont illisible, car ils sont sur une ligne. il faut ajouter des br à la main ?



test !
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
57
Le mise en page c'est parce que tu utilises un browser un peu exotique!!!?
Essayes avec IE ou Firefox, ça doit passer...

Pour ton problème, serait bien si tu pouvais mettre un code qui fonctionne pas et qui est facilement testable.
Car là tu t'imagines bien que je peux pas tester la requête, donc si tu pouvais fournir quelques objets qu'on puisse facilement tester...

<hr />
-Blog-
-Site Perso-
Messages postés
70
Date d'inscription
jeudi 26 juillet 2007
Statut
Membre
Dernière intervention
20 janvier 2011

(Je suis sous google chrome, je vais tester sous IE8, on va bien voir)

Sinon, j'ai trouvé grace à toi Bidou ! (merci :p)
Afin de vous donner un exemple, j'ai du regarder de pres la classe linqToSql qui transforme toute ma base de données en objet.
Comme j'ai 'bien' configuré ma base avec des elemenst not Null et bien certain objet on hérité de ces parametres et donc ne peuvent pas etre null. Il n'existera donc jamais :
float?[] points = { null, null, null, null, null };
Par contre, l'objet ne gere pas : float?[] points = { }; Car il n'a pas le droit d'etre null !

C'est un peu bizarre que cela ne soit pa gérer tout seul !

Du coup, je vais retoucher à toute ma base de données et autoriser le null partout... Ensuite je vais traiter les null grace à GetValueOrDefault.

Merci à tous.
Messages postés
70
Date d'inscription
jeudi 26 juillet 2007
Statut
Membre
Dernière intervention
20 janvier 2011

Meme sous IE 8 pas de mise en forme




Désolé & merci !