Problème ItemDataBound, DataItem avec LINQ [Résolu]

Signaler
Messages postés
28
Date d'inscription
dimanche 14 septembre 2003
Statut
Membre
Dernière intervention
4 juillet 2010
-
jesusonline
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
-
Bonjour,






Cela fait maintenant deux jours que je cherche à récupérer les valeurs d’un DataItem dans un ItemDataBound générer à partir d’une requête LINQ.





Voici la requête Linq :<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>









        Dim req1 = From p In gestFloContext2.detailsOperation _










                   Where p.NumOperation = numeroOperation _










                   Select New With {p.NumOperation, p.DateVacation} Distinct









En gros, quelque soit mes essais de cast, j’ai le message d’erreur suivant :



Impossible d'effectuer un cast d'un objet de type 'VB$AnonymousType_0`2[System.String,System.DateTime]' en type …





A force de faire des recherches avec notre ami GOOGLE, j’ai fini par trouver cela :





           
Dim monType As Type = e.Item.DataItem.GetType()










            Dim myNumOperation As System.Reflection.PropertyInfo = monType.GetProperty("NumOperation")










            Dim maValeur As String = Convert.ToString(myNumOperation.GetValue(e.Item.DataItem, Nothing))









Cela fonctionne très bien. Mais cela me semble très lourd puisqu’il faut le faire pour chaque valeur.



Quelqu’un a-t’il une idée plus simple ?





Merci de votre aide.





Walter

3 réponses

Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
18
Bonsoir,

en VB tu dois pouvoir faire e.item.DataItem.NumOperation, en interne le compilo VB utilisera la reflection donc pas de gain perf mais ce sera plus clair.

Mais ce comportement est normal, lorsque tu utilises un type anonyme (ce que je déconseil ... tout comme utiliser les mots clés "Linq" (tout comme utiliser des requetes d'accès aux données dans le code behind d'une page)) c'est le compilo qui va créer à la volée le type, il n'est pas connu et ne peux pas etre connu dans ton code ! 

<hr />Cyril - MVP ASP.net - MCPD ASP.net & MCTS SQL - Consultant indépendant
Messages postés
28
Date d'inscription
dimanche 14 septembre 2003
Statut
Membre
Dernière intervention
4 juillet 2010

Merci pour ta réponse. Cela fonctionne très bien.



<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>

 





Par contre je comprends de ne pas devoir utiliser de type anonyme, mais je ne vois pas comment avec LINQ. Comment « CASTER » une requête LINQ ?



Ou me déconseilles-tu l’utilisation de LINQ pour des requêtes de lecture ?




 





Merci de ton aide
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
18
comment caster une requete linq ? le résultat est un IEnumerable (enfin un IQueryable) tu peux donc retourner un IEnumerable au niveau de ta couche métier.

Je ne déconseil pas linq, juste les nouveaux mots clés.

var q = from p in dc.Persons
            where p.Name.StartsWith("toto")
            select p;

peut aussi bien s'ecrire de facon plus lisible

IEnumerable q = dc.Persons
                                         .Where(p => p.Name.StartsWith("toto");

Je te conseil également de rajouter un .AsEnumerable à la fin pour "convertir" le IQueryable en IEnumerable afin de ne pas modifier l'arbre d'expression dans la couche UI.

<hr />Cyril - MVP ASP.net - MCPD ASP.net & MCTS SQL - Consultant indépendant