Linq - Recherche expression dans ToList

Résolu
cs_JMO
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
- 8 juil. 2015 à 18:03
Whismeril
Messages postés
17329
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
17 mai 2022
- 9 juil. 2015 à 06:46
Bonjour le Forum,

Suite à extraction d'un fichier xml, j'obtiens un ToList
        MyJobs = (From k In MyList, a In k.Applications, j In a.Jobs
Select j.AffecteParent(a, k)).OrderBy(Function(j) j.EnvironnementApplicationJob).ToList()

Pour charger dans un DatagridView
Me.DataGridView1.DataSource = MyJobs

Sur un formulaire, pour afficher une sélection, via un ComboBox, dans le DGV, j'utilise
    Private Sub ComboBoxDDO_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ComboBoxDDO.SelectedIndexChanged
' IsLoading est True quand load DGV ok (function btnPDP_Click)
If IsLoading = True Then
Dim MyFilter As List(Of JOB) = MyJobs.Where(Function(c) (c.DDO = ComboBoxDDO.SelectedItem.ToString())).ToList()
Me.DataGridView1.DataSource = MyFilter
End If
End Sub
Jusqu'ici tout est ok !!!
Mon problème, je souhaiterai, via un bouton de validation et un textbox comprenant la saisie d'une expression, rechercher dans tous les champs (une trentaine) de la ToList "MyJobs" toutes les zones comprenant cette saisie.

Mes recherches sur MSDN et les méthodes Findall, Any, Contains n'ont pas abouti.

Merci de vos conseils pour m'orienter sur la bonne méthode à utiliser.

jean-marc

4 réponses

Whismeril
Messages postés
17329
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
17 mai 2022
596
8 juil. 2015 à 20:49
Bonsoir,

une précision avant tout, tu n'obtiens pas un ToList, mais une List(of), pour le coup List(Of Job).

La requête retourne une collection Ienumerable.
C'est ce type de collection qui permet l'évaluation différée de la requête, ce qui peut être pratique quand on maitrise bien, mais peut être piégeux quand on débute (et même après!).

J'ai donc évité le piège en forçant l'évaluation immédiate, pour cela il faut convertir le type de collection c'est le rôle de la méthode ToList(), mais il existe aussi ToArray(), ça aurait fait un tableau de Job.


0
cs_JMO
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
8 juil. 2015 à 20:54
Bonsoir Whismeril,

Merci de tes conseils avertis.
Je vais donc potasser MSDN sur la méthode des tableaux.

Bonne soirée,
@+
jean-marc
0
Whismeril
Messages postés
17329
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
17 mai 2022
596 > cs_JMO
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018

8 juil. 2015 à 21:33
Mais non un tableau est bien moins pratique qu'une liste. Je voulais essayer de te faire comprendre que ToList n'est pas ton résultat mais une partie des calculs pour obtenir le résultat.
0
Whismeril
Messages postés
17329
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
17 mai 2022
596
8 juil. 2015 à 21:03
Pour ta question proprement dite.

Il y a trois solutions, soit tu fais une clause where dans laquelle tu évalues chaque champ avec un ou (exemple sur 3 champs)
        Dim texteAChercher As String = "coucou"
        Dim mesJobsFiltres As List(Of Job) = (From j In mesJobs
                                               Where j.EnvName.Contains(texteAChercher) Or j.Host.Contains(texteAChercher) Or j.Name.Contains(texteAChercher)
                                               Select j).ToList()


Tu peux créer une fonction dans Job, qui teste chaque champ est qui retourne True s'il y a une occurrence, ça allégera la requête

 
'la fonction
   Public Function RechercheTousLesChamps(TexteACharcher As String) As Boolean
        RechercheTousLesChamps = False
        If Name.Contains(TexteACharcher) Or EnvName.Contains(TexteACharcher) Or Host.Contains(TexteACharcher) Or EnvName.Contains(TexteACharcher) Then RechercheTousLesChamps = True
    End Function

'la requête adaptée
        Dim texteAChercher As String = "coucou"
        Dim mesJobsFiltres As List(Of Job) = (From j In mesJobs
                                               Where j.RechercheTousLesChamps(texteAChercher)
                                               Select j).ToList()



Enfin tu peux utiliser la réflexion, ça je ne sais pas faire en VB
0
cs_JMO
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
8 juil. 2015 à 21:27
Je vais opter pour ta première proposition.
La recherche d'une expression ne devant être effectuée que sur 3 ou 4 champs au max.
Cela permettra une réponse quasi immédiate puisque inutile de parcourir toutes les colonnes/lignes de la List(Of Job).
J'ai déjà créé une vingtaine de combobox pour choix éventuel de l'utilisateur.
Quand à Réflexion, je n'ai pas regardé plus loin que mon nez cette méthode.

jean-marc
0
cs_JMO
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
8 juil. 2015 à 22:08
J'ai testé ta première proposition.
Elle répond à ma demande.

Merci,

jean-marc
0
cs_JMO
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
8 juil. 2015 à 22:33
En fait, je ne savais pas que l'on pouvait faire un "Select x).ToList()" sans préciser un champ "Select x.Name).ToList()"
0
Whismeril
Messages postés
17329
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
17 mai 2022
596 > cs_JMO
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018

9 juil. 2015 à 06:46
Select retourne l'objet que tu cherches, dans ce cas il doit s'agir d'un job, si tu retournes x.Name, tu auras une erreur de conversion impossible de string vers job.

Par contre si tu as besoin de retourner seulement les Host, là il faut dimensionner une liste de string et retourner x.Host.
0