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 19028 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 - 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 19028 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
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 27
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 19028 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656 > 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 19028 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
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 27
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 27
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 27
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 19028 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656 > 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
Rejoignez-nous