Linq - Recherche expression dans ToList via une autre ToList [Résolu]

cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention - 4 déc. 2015 à 14:21 - Dernière réponse : Whismeril 12094 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 octobre 2018 Dernière intervention
- 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
Afficher la suite 

Votre réponse

27 réponses

Meilleure réponse
cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention - 4 déc. 2015 à 20:46
3
Merci
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

Merci cs_JMO 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 89 internautes ce mois-ci

Whismeril 12094 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 octobre 2018 Dernière intervention - 4 déc. 2015 à 20:52
Ok, je tacherai d'y regarder demain soir.
cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention > Whismeril 12094 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 octobre 2018 Dernière intervention - 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
Commenter la réponse de cs_JMO
Whismeril 12094 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 octobre 2018 Dernière intervention - 4 déc. 2015 à 19:48
0
Merci
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? ;)
cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention - 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.
Commenter la réponse de Whismeril
Whismeril 12094 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 octobre 2018 Dernière intervention - 6 déc. 2015 à 08:03
0
Merci
Bonjour Jean Marc, peux tu préciser en fonction des tes exemples le résultat que tu souhaites obtenir?
cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention - 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
Whismeril 12094 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 octobre 2018 Dernière intervention - 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.
Commenter la réponse de Whismeril
cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention - 6 déc. 2015 à 10:21
0
Merci
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.
Whismeril 12094 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 octobre 2018 Dernière intervention - 6 déc. 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....
cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention > Whismeril 12094 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 octobre 2018 Dernière intervention - 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.
Commenter la réponse de cs_JMO
Whismeril 12094 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 octobre 2018 Dernière intervention - 6 déc. 2015 à 20:22
0
Merci
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()
cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention - 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
Whismeril 12094 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 octobre 2018 Dernière intervention > cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention - 6 déc. 2015 à 20:35
De rien.

As tu lu l'article que j'ai écrit sur LinqToXml?
cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention > Whismeril 12094 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 octobre 2018 Dernière intervention - 6 déc. 2015 à 20:36
oui, évidemment et plusieurs fois !!!
Whismeril 12094 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 octobre 2018 Dernière intervention > cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention - 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.
Commenter la réponse de Whismeril
cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention - 7 déc. 2015 à 19:29
0
Merci
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
Whismeril 12094 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 octobre 2018 Dernière intervention - 7 déc. 2015 à 20:07
Ceci devrait contourner le problème puisque selon ma 2eme surcharge l'index doit être null pour une propriété non indexée....
        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,Nothing)))
            Next champ
            resultats.Add(r)
        Next p


Mais pourquoi la surcharge par défaut n'est pas reconnue, mystère....
cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention > Whismeril 12094 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 octobre 2018 Dernière intervention - 7 déc. 2015 à 20:55
Le correctif "CStr(pi.GetValue(p,Nothing))" me permet d'afficher en conséquence si ageATrouver = 4 ou 5.
Reste plus qu'à trouver où tu veux en venir avec cet exemple !!!
Merci Whismeril,
Whismeril 12094 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 octobre 2018 Dernière intervention - 7 déc. 2015 à 21:45
me permet d'afficher en conséquence si ageATrouver = 4 ou 5.
oui, mais surtout te retourne une collection de valeurs, issues de champs dont la liste est paramètrable.

Au final, tu veux remplir un string de "10 kilomètres" de long ou toutes tes valeurs sont séparées par des virgules, et bien tu n'as plus qu'à faire un split.
cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention > Whismeril 12094 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 octobre 2018 Dernière intervention - 12 déc. 2015 à 10:35
Bonjour le Forum,

Bonjour Whismeril,

J'ai donc créé une classe
Public Class ListFileWord
    Public Property NameFile() As String
    Public Property Trame() As String
    Public Property TrameFile() As String
    Public Property Contract() As String
    Public Property Category() As String
    Public Property Parameters() As List(Of String)
End Class
et
' Sélection listjob à traiter 
Dim listjob = ListOfJob.Where(Function(c) (c.Trame <> String.Empty)).ToList

' Extraction paramètres à récupérer dans fichier Config
Dim parameters = listofconfigcustomer.Single(Function(c) c.Name = customer).Parameters

Dim fileword As New List(Of ListFileWord)()

For Each p As Job In listjob.Where(Function(pp) pp.Environnement = aliascustomer)
    ' Contrôle cohérence nom de la trame et existence du fichier correspondant
    Dim trame As String = returnTrame(p.Trame)
    Dim filetrame As String = returnTrameFile(p.Trame)

    If filetrame.Contains("Fichier Trame inexistant") = False Then
       Dim r As New ListFileWord()
           r.NameFile = customer & New String("_"c, 1) & p.Environnement & New String("_"c, 1) & _
                        p.Application & New String("_"c, 1) & p.Job
           r.Trame = trame
           r.TrameFile = filetrame
           r.Contract = listofconfigcustomer.Single(Function(c) c.Name = customer).NameAlias.Single(Function(a) a.Name = aliascustomer).Contract
           r.Category = listofconfigcustomer.Single(Function(c) c.Name = customer).NameAlias.Single(Function(a) a.Name = aliascustomer).Category
           r.Parameters = New List(Of String)()
           For Each champ As String In parameters
               Dim pi As PropertyInfo = p.GetType().GetProperty(champ)
               r.Parameters.Add(CStr(pi.GetValue(p, Nothing)))
           Next champ
           fileword.Add(r)
    End If
Next p

' Ici j'ai tous les éléments pour créer les fichiers de consignes
For Each item In fileword
    richtextboxlogscript.AppendText(dt(currentdate) & item.NameFile)
    richtextboxlogscript.AppendText(dt(currentdate) & item.Trame)
    richtextboxlogscript.AppendText(dt(currentdate) & item.TrameFile)
    richtextboxlogscript.AppendText(dt(currentdate) & item.Contract)
    richtextboxlogscript.AppendText(dt(currentdate) & item.Category)
    For k As Integer = 0 To item.Parameters.Count - 1
        richtextboxlogscript.AppendText(dt(currentdate) & item.Parameters.Item(k).ToString)
    Next
Next

Merci Whismeril de tes conseils et bonne journée.
Whismeril 12094 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 12 octobre 2018 Dernière intervention > cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention - 12 déc. 2015 à 19:28
De rien
Commenter la réponse de cs_JMO

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.