Problème ItemDataBound, DataItem avec LINQ

Résolu
walterskinner Messages postés 28 Date d'inscription dimanche 14 septembre 2003 Statut Membre Dernière intervention 4 juillet 2010 - 24 janv. 2009 à 19:01
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 - 25 janv. 2009 à 03:27
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

jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
24 janv. 2009 à 19:49
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
3
walterskinner Messages postés 28 Date d'inscription dimanche 14 septembre 2003 Statut Membre Dernière intervention 4 juillet 2010
24 janv. 2009 à 21:01
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
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
25 janv. 2009 à 03:27
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
0
Rejoignez-nous