Linq - Recherche expression dans ToList via une autre ToList

Résolu
cs_JMO
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
- 4 déc. 2015 à 14:21
Whismeril
Messages postés
17474
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
1 juillet 2022
- 12 déc. 2015 à 19:28
Bonjour,

Je dispose de deux fichiers xml que je charge dans des ToList.

1er fichier (import d'une base VTOM):
        ListOfJob = (From k In listofenv, a In k.Applications, j In a.Jobs
                     Select j.AffecteParent(a, k)).OrderBy(Function(j) j.EnvironnementApplicationJob).ToList()


2er fichier (fichier de config):
listofconfigcustomer = ConfigCustomer.LoadFileConfig(pathroot & pathconfig & fileconfig)

Puis, à partir de mon premier fichier, je fais une sélection
Dim listjob = ListOfJob.Where(Function(c) (c.Trame <> String.Empty)).ToList

A partir de "listjob", je souhaiterai extraire certains champs mais le choix de ces champs se trouve dans la ToList du fichier de config.
Je n'arrive pas à trouver la bonne syntaxe.

            For Each items In listjob

                Dim titi As String = items.Serveur
                MessageBox.Show(titi) ' retourne correctement le nom du serveur 


                Dim parameters = listofconfigcustomer.Single(Function(c) c.Name = customer).Parameters

                For i As Integer = 0 To parameters.Count - 1
                    MessageBox.Show(parameters(i).ToString)
                    ' parameters(i).ToString = Serveur ou TypeJob ou Application ou etc ....
                    ' c'est ce champ que je souhaite rechercher dans listjob

                Next i
            Next items

Merci pour vos suggestion.

jean-marc

6 réponses

cs_JMO
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
4 déc. 2015 à 20:46
Le fichier xml test de données
<?xml version="1.0" encoding="UTF-8"?>
<Domain name="Test jean-marc">
  <Environments>
    <Environment name="exploitation">
      <Applications>
        <Application name="Appli1">
          <Jobs>
            <Job name="appli1_exploitation_Job1">
            </Job>
            <Job name="appli1_exploitation_Job2">
            </Job>
            <Job name="appli1_exploitation_Job3">
            </Job>
            <Job name="appli1_exploitation_Job4">
            </Job>
          </Jobs>
        </Application>
        <Application name="Appli2">
          <Jobs>
            <Job name="appli2_exploitation_Job5">
            </Job>
          </Jobs> 
        </Application>
      </Applications>		
    </Environment>
    <Environment name="production">
      <Applications>
        <Application name="Appli3">
          <Jobs>
            <Job name="appli3_production_Job1">
            </Job>
            <Job name="appli3_production_Job2">
            </Job>
          </Jobs>
        </Application>
        <Application name="Appli4">
          <Jobs>
            <Job name="appli4_production_Job3">
            </Job>
          </Jobs> 
        </Application>
      </Applications>		
    </Environment>	
  </Environments>
</Domain>

Le fichier xml test de config
<?xml version="1.0" encoding="UTF-8"?>
<Customers>
   <Customer name="SAVEMUTU" product="VTOM" axone="JA888" infocgn="Non">
 	  <Alias name="exploitation" contrat="TOTO" codebien="I25 Incident Ordonnancement"></Alias>
	  <Alias name="production" contrat="TATA" codebien="I24 Storage Incident"></Alias>
	     <Parameters>
		<Parameter>Environnement</Parameter>
         	<Parameter>Job</Parameter>
	     </Parameters>	  
   </Customer>
   <Customer name="CLIENT1" product="VTOM" axone="JA4567" infocgn="Oui">
      <Alias name="CLIENT1" contrat="TITI" codebien="I22 Server Incident"></Alias>
         <Parameters>
         	<Parameter>Application</Parameter>
         </Parameters>
   </Customer>
 </Customers> 

Pour exemple :
Je lis le fichier config et souhaite récupérer les champs "Environnement" et "Application" de l'alias "exploitation" du client name SAVEMUTU dans le fichier xml de données.

Suite à mon précédent thread, j'ai modifié mon config et donc les classes en conséquence.
Public Class ItemsConfig
    Public Property Name() As String
    Public Property Contract() As String
    Public Property Category() As String

End Class
Public Class ConfigCustomer
    Public Property Name() As String
    Public Property NameAlias() As List(Of ItemsConfig)
    Public Property Parameters() As List(Of String)
    Public Property Infocgn() As String
    Public Property Axone_Contract() As String
    Public Property Product() As String

    Public Shared Function LoadFileConfig(ByVal Path As String) As List(Of ConfigCustomer)
        Dim xdoc As XDocument = XDocument.Load(Path)
        Return (
            From c In xdoc.Descendants("Customer")
            Select New ConfigCustomer With {.Name = c.Attribute("name").Value, _
                                            .Product = c.Attribute("product").Value, _
                                            .Infocgn = c.Attribute("infocgn").Value, _
                                            .Axone_Contract = c.Attribute("axone").Value, _
                                            .Parameters = (From p In c.Descendants("Parameter")
                                                           Select p.Value).ToList(), _
                                            .NameAlias = (From a In c.Descendants("Alias")
                                                          Select New ItemsConfig With {.Name = a.Attribute("name").Value, _
                                                                                       .Contract = a.Attribute("contrat").Value, _
                                                                                       .Category = a.Attribute("codebien").Value
                                                                                       }).ToList()}).ToList()
    End Function
End Class

jean-marc
3
Whismeril
Messages postés
17474
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
1 juillet 2022
600
4 déc. 2015 à 20:52
Ok, je tacherai d'y regarder demain soir.
0
cs_JMO
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26 > Whismeril
Messages postés
17474
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
1 juillet 2022

4 déc. 2015 à 20:57
merci whismeril,

le <Customer name="SAVEMUTU"> du fichier de config est le nom du fichier xml car je dispose de x fichiers xml client.

Bonne soirée
@+ jean-marc
0
Whismeril
Messages postés
17474
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
1 juillet 2022
600
4 déc. 2015 à 19:48
Bonsoir Jean Marc,

Avec un exemple de données ce sera plus simple pour de te répondre.

Les résultats de te requête ne sont pas des ToList, mais des listes, la méthodes ToList() convertit le type de collection IEnumarble en liste, quand tu fais un ToArray pour obtenir un tableau, tu n'appelles pas tes tableaux des ToTableaux? Si? ;)
0
cs_JMO
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
4 déc. 2015 à 19:54
bonsoir Whismeril,
Désolé pour mon vocabulaire vbnetiste erroné !!!
Je vais créer deux fichiers simplistes (données et config) pour faciliter l'expression de mes besoins.
0
Whismeril
Messages postés
17474
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
1 juillet 2022
600
6 déc. 2015 à 08:03
Bonjour Jean Marc, peux tu préciser en fonction des tes exemples le résultat que tu souhaites obtenir?
0
cs_JMO
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
6 déc. 2015 à 08:40
Bonjour Whismeril,

Exemple:
je traite un fichier en entier (export_SAVEMUTU.xml).

Pour le fichier config, je traiterai les lignes
<?xml version="1.0" encoding="UTF-8"?>
<Customers>
<Customer name="SAVEMUTU" product="VTOM" axone="JA109119" infocgn="Non">
<Alias name="exploitation" contrat="INTERNE" codebien="I25 Incident Ordonnancement"></Alias>
<Alias name="SV_CLIENT4" contrat="CLIENT4" codebien="I20 Incident Sauvegarde"></Alias>
<Alias name="SV_CLIENT5" contrat="CLIENT5" codebien="I20 Incident Sauvegarde"></Alias>
<Alias name="SV_CLIENT6" contrat="CLIENT6" codebien="I20 Incident Sauvegarde"></Alias>
<Parameters>
<Parameter>Environnement</Parameter>
<Parameter>Application</Parameter>
<Parameter>Job</Parameter>
<Parameter>DDO</Parameter>
<Parameter>Serveur</Parameter>
<Parameter>TypeJob</Parameter>
<Parameter>Script</Parameter>
<Parameter>ParametresScript</Parameter>
<Parameter>CycleJob</Parameter>
<Parameter>CommentaireJob</Parameter>
</Parameters>
</Customer>

Dans ma boucle, je vais traiter:
Customer = SAVEMUTU et ENV = exploitation
puis, CUSTOMER = SAVEMUTU et ENV = SV_CLIENT4
puis, CUSTOMER = SAVEMUTU et ENV = SV_CLIENT5
etc ...
Pour cette boucle, pas de problème.
Les champs <Parameter> sont utilisés à récupérer pour chaque boucle.
Ces champs sont créés dans
        Dim listofenv As List(Of Env) = (
From d In xdoc.Descendants("Environment")
Select New Env With {
.Name = d.@name, _
.Serveur = d.@host, _
.DateBascule = New String(" "c, 2) & d.@date, _
.Formule = returnFieldEmpty(If(d.Elements("Planning").Count() > 0, d.Elements("Planning").Value, Nothing)), _
.Planning = String.Empty, _
.Queue = d.@queue, _
.Profil = d.@user, _
.Applications = (
From a In d.Descendants("Application")
Select New App With {
.Name = a.@name, _
.Serveur = If(a.Attributes("host").Count() > 0, a.@host, Nothing), _
.RessourcesApp = (
From r In a.Descendants("ExpectedResource")
Select New Ressourcesapplication With {
.Name = r.@resource,
.Type = r.@operator,
.Valeur = r.@Value
}).ToList(),
.DateBascule = New String(" "c, 2) & If(a.Attributes("date").Count() > 0, a.@date, Nothing), _
.Formule = returnFieldEmpty(If(a.Elements("Planning").Count() > 0, a.Elements("Planning").Value, Nothing)), _
.Planning = If(a.Elements("Planning").Count() > 0,
"[" & a.Element("Planning").@daysInWeek & "],[" & _
a.Element("Planning").@daysInMonth & "],[" & _
a.Element("Planning").@weeksInMonth & "],[" & _
a.Element("Planning").@monthsInYear & "]", Nothing), _
.Queue = If(a.Attributes("queue").Count() > 0, a.@queue, Nothing), _
.Profil = If(a.Attributes("user").Count() > 0, a.@user, Nothing), _
.Jobs = (
From j In a.Descendants("Job")
Select New Job With {
.EnvironnementApplicationJob = d.@name & "_" & a.@name & "_" & j.@name,
.DDO = returnDDO(d.@name, a.@name, a.@comment), _
.Job = j.@name, _
.RessourcesJobs = (
From l In j.Descendants("ExpectedResource")
Select New Ressourcejob With {
.Name = l.@resource,
.Type = l.@operator,
.Valeur = l.Element("Value").Value
}).ToList(),
.Serveur = returnHost(If(j.Attributes("host").Count() > 0, j.@host, String.Empty), j.@name), _
.CommentaireApp = If(a.Attributes("comment").Count() > 0, a.@comment, Nothing), _
.CommentaireJob = returnFieldEmpty(If(j.Attributes("comment").Count() > 0, j.@comment, Nothing)), _
.Script = returnFieldEmpty(If(j.Element("Script").Value().ToString = "#M3#",
j.Element("Script").Value().ToUpper,
j.Element("Script").Value().ToLower)), _
.Parametres = If(j.Elements("Parameters").Count() = 0, Nothing, (
From p In j.Descendants("Parameter")
Select p.Value).ToList()), _
.Trame = returnTrame(If(j.Attributes("family").Count() > 0, j.@family, String.Empty)), _
.ModeExecEnv = New String(" "c, 2) & returnGeneric(d.@enginePid), _
.ModeExecApp = New String(" "c, 2) & returnGeneric(a.@mode), _
.ModeExecJob = New String(" "c, 2) & returnGeneric(j.@mode), _
.TypeJob = returnTypeJob(If(j.Attributes("jobType").Count() > 0, j.@jobType, Nothing), j.Element("Script").Value.ToString), _
.TypeFrequence = New String(" "c, 2) & returnTypeFrequency(j.@onDemand), _
.Frequence = New String(" "c, 1) & returnGeneric(j.@frequency), _
.Cyclique = New String(" "c, 1) & returnYesNo(j.@cycleEnabled), _
.CycleJob = j.@cycle, _
.HeureDebut = j.@minStart, _
.HeureFin = j.@maxStart, _
.DebutDerniereExecution = returnConvertTime(Convert.ToInt32(j.@timeBegin)), _
.FinDerniereExecution = returnConvertTime(Convert.ToInt32(j.@timeEnd)), _
.Duree = returnTimeDiff(CDate(.DebutDerniereExecution), CDate(.FinDerniereExecution)), _
.DateBascule = New String(" "c, 2) & If(j.Attributes("date").Count() > 0, j.@date, Nothing), _
.Queue = If(j.Attributes("queue").Count() > 0, j.@queue, Nothing), _
.Formule = returnFieldEmpty(If(j.Elements("Planning").Count() > 0, j.Elements("Planning").Value, Nothing)), _
.Planning = If(j.Elements("Planning").Count() > 0,
"[" & j.Element("Planning").@daysInWeek & "],[" & _
j.Element("Planning").@daysInMonth & "],[" & _
j.Element("Planning").@weeksInMonth & "],[" & _
j.Element("Planning").@monthsInYearlue & "]", Nothing), _
.Profil = If(j.Attributes("user").Count() > 0, j.@user, Nothing), _
.ApplicationPredecesseur = returnLinks(parent, child, d.@name & _
New String("/"c, 1) & a.@name), _
.ApplicationSuccesseur = returnLinks(child, parent, d.@name & _
New String("/"c, 1) & a.@name), _
.JobPredecesseur = returnLinks(parent, child, d.@name & _
New String("/"c, 1) & a.@name & _
New String("/"c, 1) & j.@name), _
.JobSuccesseur = returnLinks(child, parent, d.@name & _
New String("/"c, 1) & a.@name & _
New String("/"c, 1) & j.@name), _
.Alarme = returnAlarm(d.@name & New String("/"c, 1) &
a.@name & New String("/"c, 1) & j.@name), _
.CodeContrat = returnTicketing(customer, d.@name, "Contract"), _
.Categorie = returnTicketing(customer, d.@name, "Category")
}).ToList()}).ToList()}).ToList()

ListOfJob = (From k In listofenv, a In k.Applications, j In a.Jobs
Select j.AffecteParent(a, k)).OrderBy(Function(j) j.EnvironnementApplicationJob).ToList()

Comme tu vois, il a x champs.

Dans la fonction ci-dessous, je souhaite récupérer que les champs qui sont indiqués dans le fichier config.
    Private Sub CreateDataSetTables(ByVal choice As String, ByVal customer As String, ByVal aliascustomer As String)

' Création Collection arrayListMOP en fonction du choix (Client, Delta, SAVEMUTU ou SV_)
'
If customer.ToString = aliascustomer.ToString Then
' Toutes les Consignes Client ou SAVEMUTU
' Création Collection arrayListMOP pour génération des Consignes .docx
'
' Contrôle des jobs avec trame - Champ family renseigné dans VTOM
Dim listjob = ListOfJob.Where(Function(c) (c.Trame <> String.Empty)).ToList

For Each items In listjob

Dim env As String = items.Environnement
Dim app As String = items.Application
Dim job As String = items.Job
Dim trame As String = returnTrame(items.Trame)
Dim tramefile As String = returnTrameFile(items.Trame)
Dim configalias As String = listofconfigcustomer.Single(Function(c) c.Name = customer).NameAlias.Item(0).Name
Dim configcontract As String = items.CodeContrat
Dim configcategory As String = items.Categorie
Dim configparameters = listofconfigcustomer.Single(Function(c) c.Name = customer).Parameters


Dim parameters = listofconfigcustomer.Single(Function(c) c.Name = customer).Parameters

Dim listparameters As List(Of String) = New List(Of String)()

For i As Integer = 0 To parameters.Count - 1
listparameters.Add(i)

' parameters(i).ToString = Serveur ou TypeJob ou Application ou etc ....
' c'est ce champ que je souhaite rechercher dans listjob

Next i
Next items
End If
End Function

Au final, je souhaite constituer un arrayList contenant pour chaque ligne job :
Env, App, Job, Trame, FileTrame, Env, App, Job, DDO, Serveur, TypeJob, Script, ParametresScript, CycleJob, CommentaireJob
0
Whismeril
Messages postés
17474
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
1 juillet 2022
600
6 déc. 2015 à 09:46
3 questions
  • Donc, il y a une part "fixe"

"Env, App, Job, Trame, FileTrame,"
Et une part variable qui est la liste des paramètres
" Env, App, Job, DDO, Serveur, TypeJob, Script, ParametresScript, CycleJob, CommentaireJob" c'est bien ça
  • Env, App et Job, sont en double, on ne les prend qu'une fois?
  • il te faut un objet constitué uniquement des champs listés (cas 1), ou un job complet, dont les autres champs sont null (cas 2) ou un job complet peu importe la valeur des autres champs (cas 3)?

Les cas 2 et 3, c'est assez facile, le cas 1 c'est pas la même histoire.
0
cs_JMO
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
6 déc. 2015 à 10:21
part fixe :
Dim env As String = items.Environnement
Dim app As String = items.Application
Dim job As String = items.Job
Dim trame As String = returnTrame(items.Trame) & Environment.NewLine
Dim tramefile As String = returnTrameFile(items.Trame)
Dim configalias As String = listofconfigcustomer.Single(Function(c) c.Name = customer).NameAlias.Item(0).Name
Dim configcontract As String = items.CodeContrat
Dim configcategory As String = items.Categorie


Variables à récupérer par rapport à Paramètres du fichier config

J'aimerai éviter ceci
Dim lineMOP As String = customer & "." & _ 
                        items.Environnement & "." & items.Application & "." & _
                        items.Job & "," & _
                        returnFile(items.Trame) & "," & _
                        returnTrameFile(items.Trame) & "," & _
                        returnTrameFile(items.Trame) & "," & _
                        items.CodeContrat & "," & _ 
                        items.Categorie & ","

Dim configparameters = listofconfigcustomer.Single(Function(c) c.Name = customer).Parameters

For i As Integer = 0 To configparameters.Count - 1
    lineMOP += lineMOP & returnItemMOP(configparameters(i) & ","
Next i
arrayListMOP.Add(lineMOP)


Function ReturnItemMOP(ByVal e As String) As String
         Select Case e
         Case "Environnement" : Return items.Environnement
         Case "Application" : Return items.Application
         Case "Job" :
         Case "Serveur" :	
         Case "CommentaireApp" :	
         Case "CommentaireJob" :	
         Case "ModeExecEnv" :	
         Case "ModeExecApp" :	
         Case "ModeExecJob" :	
         Case "TypeJob" :	
         Case "Script" :	
         Case "ParametresScript" :	
         Case "RessourcesApp" :	
         Case "RessourcesJob" :	
         Case "TypeFrequence" :	
         Case "Frequence" :	
         Case "Cyclique" :	
         Case "CycleJob" :	
         Case "HeureDebut" :	
         Case "HeureFin" :	
         Case "DebutDerniereExecution" :	
         Case "FinDerniereExecution" :	
         Case "Duree" :	
         Case "DateBascule" :	
         Case "Formule" :	
         Case "Planning" :	
         Case "Queue" :	
         Case "Profil" :	
         Case "ApplicationPredecesseur" :	
         Case "ApplicationSuccesseur" :	
         Case "JobPredecesseur" :	
         Case "JobSuccesseur" :	
         Case "Alarme" :	
         Case Else : Return String.Empty
      End Select
End Function

Dans la fonction returnItemMOP, je n'ai pas encore écrit tous les items et retours.
Les champs env, app et job sont utilisés 2 fois:
1) Ce sera le nom de mon fichier docx à crééer "Customer.Environnement.Application.Job
2) Les champs Environnement, Application, Job et ceux passés en paramètre servent pour créer mes fichiers de consignes à partir de plusieurs Templates.
C'est dans ceux-ci que je renseigne les champs "CustomDocumentProperties".

Nous sommes dans le cas 1.
0
Whismeril
Messages postés
17474
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
1 juillet 2022
600
Modifié par Whismeril le 6/12/2015 à 18:42
Nous sommes dans le cas 1.

en fait non, ta part variable crée un tableau et pas des propriétés d'un objet.

Ta méthode fonctionne, mais a le désavantage de devoir être retouchée à chaque changement dans la classe Job.

Tu peux te servir de la réflexion.

Je te fais un exemple, plus simple que ton besoin qui se complique de questions en questions....
0
cs_JMO
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26 > Whismeril
Messages postés
17474
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
1 juillet 2022

6 déc. 2015 à 18:57
Bonsoir Whismeril,

Ta méthode fonctionne, mais a le désavantage de devoir être retouchée à chaque changement dans la classe Job.

La classe Job ne peut pas évoluer car elle comprend tous les champs du logiciel VTOM.
Si c'est trop compliqué, la fonction provisoire "ReturnItemConfig" fera l'affaire.
Dans cette fonction, j'ai rajouté certains champs qui figurent éventuellement dans le fichier config mais qui n'existent pas dans le fichier export_XXXX_xml. C'est pour cette raison que j'ai créé le "infocgn=oui ou non" dans le fichier config.
Si infocgn=oui, je vais lire un fichier xlsx du client qui précise les champs supplémentaires à traiter.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril
Messages postés
17474
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
1 juillet 2022
600
6 déc. 2015 à 20:22
Alors une classe Personne, basique (sans jeux de mots!)
Nom, Prénom, Date de Naissance -> Age

	Public Class Personne
		Public Sub New(ByVal Nom As String, ByVal Prenom As String, ByVal Naissance As Date)
			Me.Nom = Nom
			Me.Prenom = Prenom
			Me.Naissance = Naissance 'j'affecte la propriété comme ça l'age sera calculé
		End Sub

		Private _naissance As DateTime
		Public Property Naissance() As DateTime
			Get
				Return _naissance
			End Get
			Set(ByVal value As Date)
				_naissance = value
				Age = DateTime.Now.Year - _naissance.Year
			End Set
		End Property

		Public Property Nom() As String

		Public Property Prenom() As String

		Private _age As Integer
		Public Property Age() As Integer
			Get
				Return _age
			End Get
			Private Set(ByVal value As Integer)
				_age = value
			End Set
		End Property

	End Class


Une classe de résultats
	Public Class ResultatJMO
		Public Property Age() As Integer

		Public Property Parametres() As List(Of String)'je mets une liste et pas un arraylist car linq sait caster tout seul en liste.
	End Class


On va traiter une liste de personnes, en retournant le prénom et le nom de ceux qui ont 5 ans.
Une fois triées les personnes avec le bon âge, on utilise la réflexion pour obtenir les champs dont le nom est présent dans un tableau.
Premier exemple avec un For Each, ou je décompose un peu les étapes.
			Dim personnes As New List(Of Personne)()
			personnes.Add(New Personne("Di", "Alain", Date.Parse("01/01/2010")))
			personnes.Add(New Personne("Sort", "Jean", Date.Parse("01/01/2011")))
			personnes.Add(New Personne("Zétofrais", "Mélanie", Date.Parse("02/02/2010")))
			personnes.Add(New Personne("Croche", "Sara", Date.Parse("02/02/2011")))

			Dim ageATrouver As Integer = 5
			Dim champsARetourner() As String = {"Prenom","Nom" }

			Dim resultats As New List(Of ResultatJMO)()

			For Each p As Personne In personnes.Where(Function(pp) pp.Age = ageATrouver)
				Dim r As New ResultatJMO()
				r.Age = ageATrouver
				r.Parametres = New List(Of String)()
				For Each champ As String In champsARetourner
					Dim pi As PropertyInfo = p.GetType().GetProperty(champ)
					r.Parametres.Add(CStr(pi.GetValue(p)))
				Next champ
				resultats.Add(r)
			Next p


Ça peut se faire aussi avec une requête Linq
			Dim resultats As List(Of ResultatJMO) = (
			    From p In personnes.Where(Function(pp) pp.Age = ageATrouver)
			    Select New ResultatJMO With {.Age = ageATrouver, .Parametres = (
			            From c In champsARetourner
			            Let pi = p.GetType().GetProperty(c)
			            Select CStr(pi.GetValue(p))).ToList()
}).ToList()
0
cs_JMO
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
6 déc. 2015 à 20:31
Merci Whismeril de ton temps consacré.
Je vais analyser et tâcher de comprendre ta proposition.
Retour sera fait.
Bonne soirée,
jean-marc
0
Whismeril
Messages postés
17474
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
1 juillet 2022
600 > cs_JMO
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018

6 déc. 2015 à 20:35
De rien.

As tu lu l'article que j'ai écrit sur LinqToXml?
0
cs_JMO
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26 > Whismeril
Messages postés
17474
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
1 juillet 2022

6 déc. 2015 à 20:36
oui, évidemment et plusieurs fois !!!
0
Whismeril
Messages postés
17474
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
1 juillet 2022
600 > cs_JMO
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018

6 déc. 2015 à 20:53
Alors, je n'ai pas insisté assez sur le bien fait d'utiliser des méthodes (de classe ou pas) ou des constructeurs à l'extérieur de la requête.

Par ce que celle que tu montres ici http://codes-sources.commentcamarche.net/forum/affich-10057376-linq-recherche-expression-dans-tolist-via-une-autre-tolist#7 est bien taribiscotée.

Je me suis arraché les cheveux un moment dessus.
0
cs_JMO
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
7 déc. 2015 à 19:29
Bonsoir Whismeril,
J'essaie de tester ton code mais j'ai une erreur sur
CStr(pi.GetValue(p))
La résolution de surcharge a échoué, car aucun 'GetValue' accessible n'accepte ce nombre d'arguments.

jean-marc
0
Whismeril
Messages postés
17474
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
1 juillet 2022
600
7 déc. 2015 à 19:50
Ha!

Quelle est ta framework?
0
cs_JMO
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26 > Whismeril
Messages postés
17474
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
1 juillet 2022

7 déc. 2015 à 19:53
VB 2010 Express Frameword 4.5
0
Whismeril
Messages postés
17474
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
1 juillet 2022
600
7 déc. 2015 à 19:52
As tu mis Imports System.Reflection? Je ne l'avais pas précisé.
Quoique que certainement sinon ça planterait à la déclaration du PropertyInfo
0
cs_JMO
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26 > Whismeril
Messages postés
17474
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
1 juillet 2022

7 déc. 2015 à 19:58
Imports System.ComponentModel
Imports System.Xml.XPath
Imports IO = System.IO
Imports System.Data.OleDb
Imports System.Text
Imports System.Diagnostics
Imports System.Diagnostics.Process
Imports System.Reflection
Imports System.Windows
Imports System.Runtime.InteropServices

Imports System.Linq

Imports System
Imports System.Windows.Forms
Imports System.Drawing

Imports Microsoft.Office.Interop
Imports Excel = Microsoft.Office.Interop.Excel
Imports Word = Microsoft.Office.Interop.Word
0
Whismeril
Messages postés
17474
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
1 juillet 2022
600
7 déc. 2015 à 20:04
Ça c'est fort de café!

Comme tu peux le voir sur ma capture, j'ai 3 surcharges, dont la première à la bonne signature....;
0