none
Recherche multi-critères RRS feed

  • Question

  • Bonjour,
    Je souhaiterais faire une recherche multi-critères sur un objet [B]Agent[/B] de mon projet:
    -Agent(AgentMatricule, Photo,IdentifiantCivilite, Nom, DateNaissanceAgent, LieuNaissanceAgent, EmpreinteIndexDroitAgent ,DateEmbauche, SexeAgent, AncienneteAgent, Grade,Login, MotDepasse, DateCreationMotdePasse ,DateDernièreConnexion, DateDernièreDeconnexion, AgentGroupe, AgentEquipe,TelephoneAgent,EmailAgent).

    Mes recherches doivent porter sur 6 attributs à savoir AgentMatricule (string),  Nom (string),
     Grade (int),   AgentEquipe (string),TelephoneAgent (string), NiveauAnglais, tous renseignés depuis les champs correspondants. Et chacun de ces champs peut -être renseigné ou non.
    Le problème est que en faisant avec des conditions [B]if[/B], ça devient fastidieux. Alors, j'aimerais savoir qui a une idée d'une autre façon plus facile à coder?

    Si, oui une indication sera la bienvenue.
    jeudi 22 mai 2014 13:01

Réponses

  • Bonjour,

    Avec Linq c'est relativement simple :

    public static Agent[] RechercherAgents(Agent[] agents, CritèreAgent critères)
    {
        IEnumerable<Agent> agentsFiltrés;
        agentsFiltrés = agents;
    
        if (critères.AgentMatricule != null)
        {
            agentsFiltrés = agentsFiltrés.Where(a => a.AgentMatricule == critères.AgentMatricule);
        }
    
        if (critères.Nom != null)
        {
            agentsFiltrés = agentsFiltrés.Where(a => a.Nom == critères.Nom);
        }
    
        if (critères.Grade != null)
        {
            agentsFiltrés = agentsFiltrés.Where(a => a.Grade == critères.Grade);
        }
    
        // ...
    
        return agentsFiltrés.ToArray();
    }

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    jeudi 22 mai 2014 23:48
    Modérateur

Toutes les réponses

  • Bonjour,

    Avec Linq c'est relativement simple :

    public static Agent[] RechercherAgents(Agent[] agents, CritèreAgent critères)
    {
        IEnumerable<Agent> agentsFiltrés;
        agentsFiltrés = agents;
    
        if (critères.AgentMatricule != null)
        {
            agentsFiltrés = agentsFiltrés.Where(a => a.AgentMatricule == critères.AgentMatricule);
        }
    
        if (critères.Nom != null)
        {
            agentsFiltrés = agentsFiltrés.Where(a => a.Nom == critères.Nom);
        }
    
        if (critères.Grade != null)
        {
            agentsFiltrés = agentsFiltrés.Where(a => a.Grade == critères.Grade);
        }
    
        // ...
    
        return agentsFiltrés.ToArray();
    }

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    jeudi 22 mai 2014 23:48
    Modérateur
  • Bonjour,

    Merci pour la réponse. Si vous permettez, je dois afficher les  sélectionnées, si elles existent ou pas, depuis ma BD. Mon Application est de type 3 tiers. L' IU WebForm, la BLL (AgentBLL pour ce cas) et la DAL (AgentDAL pour ce cas). Comment pourrais-je intégrer tel processus à la Solution ici proposée?

    Cordiallement.

    vendredi 23 mai 2014 16:47
  • Bonjour,

    Si vous permettez, je dois afficher les  sélectionnées, si elles existent ou pas, depuis ma BD
    Que voulez vous dire exactement ?

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    dimanche 25 mai 2014 23:45
    Modérateur
  • Bonjour,

    Merci d'avance. Je voudrais que le tableau de recherche charge dynamiquement la liste de tous les agents depuis la Base de Données et effectue les vérifications nécessaires au filtrage.

    Avec votre aide voici la méthode de recherche que j'ai pu élaborer:

      public static Agent [] RechercherAgent(Agent[] agents, string aMatriculeAgent, string aNomAgent, string aNumTelephone,string aEquipe, int aGrade,int aNiveauLangue)
            {
                IEnumerable<Agent>AgentFiltrés;
    
                AgentFiltrés = agents;
    
             
                
    
                if(aMatriculeAgent !=null)
                {
                    AgentFiltrés.Where(a=>a.AgentMatricule.Contains(aMatriculeAgent));
                }
    
                if (aNomAgent != null)
                {
                    AgentFiltrés.Where(a => a.Nom.Contains(aNomAgent));
                }
    
                if (aNumTelephone != null)
                {
                    AgentFiltrés.Where(a => a.TelephoneAgent.Contains(aNumTelephone));
                }
    
                if (aEquipe != null)
                {
                    AgentFiltrés.Where(a => a.AgentEquipe.Contains(aEquipe));
                }
    
                if (aNiveauLangue != null)
                {
                    AgentFiltrés.Where(a => a.NiveauAnglais.Equals(aNiveauLangue));
                }
    
    
                return AgentFiltrés.ToArray();
    
    
            }

    Cette méthode est appelée sous un bouton. Voici le code sous ce bouton:

     protected void BtRechercher_Click(object sender, EventArgs e)
            {
                  Agent[] Ag = new Agent[0];
                RechercherAgent(Ag,txtMatricule.Text.Trim(),txtNomAgent.Text.Trim(),txtNumeroTelephone.Text.Trim(),(DDL_Equipe.SelectedValue),Convert.ToInt32(DDL_Grade.SelectedValue),Convert.ToInt32(DDL_Langue.SelectedValue));
    
                var source = new BindingSource();
                
    
                foreach (var oAgent in RechercherAgent(Ag, txtMatricule.Text.Trim(), txtNomAgent.Text.Trim(), txtNumeroTelephone.Text.Trim(), (DDL_Equipe.SelectedValue), Convert.ToInt32(DDL_Grade.SelectedValue), Convert.ToInt32(DDL_Langue.SelectedValue)))
                {
                    
                    source.Add(oAgent);
                }
    //Liaison et chargement de la gridview.
                gdvAgents.DataSource = source;
                gdvAgents.DataBind();
    }

    Le problème est qu'avec ceci, la grille affiche la liste de tous les agents disponible dans la Base de Données.

     Alors que je voudrais que ne soit seulement affiché que la liste des agents vérifiant les critères entrés dans les TextBoxs.

    Merci d'avance.

    Cordialement.

    lundi 26 mai 2014 15:10
  • Bonjour,

    Dans la méthode RechercherAgent() vous passez en paramètre un tableau vide. Donc la méthode vous retournera toujours aucun agent.

    Vous devez dans votre cas ne pas passer en paramètre les agents mais les récupérer depuis le contexte Entity Framework :

    public static Agent[] RechercherAgent(string aMatriculeAgent, string aNomAgent, string aNumTelephone,string aEquipe, int aGrade,int aNiveauLangue)
    {
        IQueryable<Agent> AgentFiltrés;
    MonContextEF context = new MonContextEF();
    AgentFiltrés = context.Agents;
    ...
    }

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    lundi 26 mai 2014 23:36
    Modérateur
  • Bonjour,

    C'est ce que j'ai fait. Voici mon code:

      public static Agent [] RechercherAgent(string aMatriculeAgent, string aNomAgent, string aNumTelephone,string aEquipe, int aGrade,int aNiveauLangue)
            {
                IEnumerable<Agent>AgentFiltrés;
    
                AgentFiltrés = ContexteDAO.ContexteDonnees.Agents;
    
             
                
    
                if(aMatriculeAgent !=null)
                {
                   AgentFiltrés = AgentFiltrés.Where(a=>a.AgentMatricule.Contains(aMatriculeAgent));
                }
    
                if (aNomAgent != null)
                {
                    AgentFiltrés = AgentFiltrés.Where(a => a.Nom.Contains(aNomAgent));
                }
    
                if (aNumTelephone != null)
                {
                    AgentFiltrés = AgentFiltrés.Where(a => a.TelephoneAgent.Contains(aNumTelephone));
                }
    
                if (aEquipe != null)
                {
                    AgentFiltrés = AgentFiltrés.Where(a => a.AgentEquipe.Contains(aEquipe));
                }
    
                if (aNiveauLangue != 0)
                {
                    AgentFiltrés = AgentFiltrés.Where(a => a.NiveauAnglais.Equals(aNiveauLangue));
                }
    
    
                return AgentFiltrés.ToArray();
    
    
            }
    

    Cordialement.


    mardi 27 mai 2014 00:21
  • Merci, j'ai pu y remédier avec !string.IsNullOrEmpty en lieu et place de !=Null et en respectant la casse.

    Merci.

    mardi 27 mai 2014 10:06