IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Silverlight Discussion :

[RIA Services] Load d'un domain contexts avec plusieurs Where()


Sujet :

Silverlight

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Octobre 2008
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 111
    Par défaut [RIA Services] Load d'un domain contexts avec plusieurs Where()
    Bonjour à tous

    Je suis en SL3, avec SQL 2008.
    J'ai l'habitude de récupérer mes données en base de manière classique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MyContext myContext = new MyContext();
    myContext.Load<MyTable>(myContext.GetMyTableQuery().Where(x => x.filter = 50);
    Mon problème, c'est qu'en fonction des filtres saisis par l'utilisateur, je peux avoir potentiellement 50 clauses Where, à combiner. Et je veux éviter ce genre de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    if (!string.IsNullOrEmpty(tbFiltre1.Text))
    {
      if (!string.IsNullOrEmpty(tbFiltre2.Text))
      {
        myContext.Load<MyTable>(myContext.GetMyTableQuery().Where(x => x.filter1 = tbFiltre1.Text).Where(x => x.filter2 = tbFiltre2.Text);
      }
      else
      {
        myContext.Load<MyTable>(myContext.GetMyTableQuery().Where(x => x.filter1 = tbFiltre1.Text);
      }
    }
    else
    {
      if (!string.IsNullOrEmpty(tbFiltre2.Text))
      {
        myContext.Load<MyTable>(myContext.GetMyTableQuery().Where(x => x.filter2 = tbFiltre2.Text);
      }
      else
      {
        myContext.Load<MyTable>(myContext.GetMyTableQuery());
      }
    }
    Et là je donne un exemple avec seulement 2 filtres. Il y en a potentiellement 50, des textboxes, des comboboxes...

    Existe t-il un moyen de variabiliser les clauses Where (en LINQ ??) pour pouvoir les combiner après, ou autre ??

    Merci d'avance

  2. #2
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Par défaut
    Tu créé d'abord ta query puis tu appelles le load en dernier dessus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var query = myContext.GetMyTableQuery();
     
    if (!string.IsNullOrEmpty(tbFiltre1.Text))
        query = query .Where(x => x.filter1 = tbFiltre1.Text)
     
    if (!string.IsNullOrEmpty(tbFiltre2.Text))
        query = query .Where(x => x.filter2 = tbFiltre2.Text)
     
    myContext.Load<MyTable>(query)

  3. #3
    Membre actif
    Inscrit en
    Octobre 2008
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 111
    Par défaut
    C'est fonctionne ! Merci beaucoup anthyme

  4. #4
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Par défaut
    de rien

    Il faut juste se rappeler que cette methode fonctionne avec tous les provider Linq.

    Un where ne fait que renvoyer une nouvelle requête affiné que l'on peut a nouveau affiner.

  5. #5
    Membre actif
    Inscrit en
    Octobre 2008
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 111
    Par défaut
    Je déterre un ancien de mes sujets car j'ai une nouvelle problématique similaire.
    J'essaie de faire une succession de .Where(...) à un moment où j'ai déjà rapatrié la table en base de données.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // je rapatrie mes données en base
    myContext.GetMyTableQuery(myContext.GetMyTableQuery());
     
    // partons du fait que myContext est maintenant rempli
     
    var query = myContext.MyTables;
    query = query.Where(x => x.filter1 = tbFiltre1.Text)
    query = query.Where(x => x.filter2 = tbFiltre2.Text)
    Le code précédent ne compile pas sur les 2 dernières lignes :
    Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<...MyTable>' to 'System.Windows.Ria.EntitySet<...MyTable>'
    Je comprends à peu près le pourquoi de l'erreur, mais je ne vois pas comment m'en sortir.

    Merci d'avance !
    (oui je sais, je ne maîtrise pas bien ces classes )

  6. #6
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2011
    Messages : 82
    Par défaut
    Bonjour,

    si c'est du RIA, moi je mettrai un petit FilterDescriptor dans le code-behind.
    Pour pas tout reprendre je mettrai un truc comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    // Variable de classe
    private FilterDescriptor filtreNom = new FilterDescriptor("Nom", FilterOperator.Contains, string.Empty);
     
    public MaClasse()
    {
        InitializeComponent();
     
        // Filtres
        MaClasseDomainDataSource.FilterDescriptors.Add(filtreNom);
        MaClasse.FilterOperator = FilterDescriptorLogicalOperator.Or;
    }
     
    private void WatermarkedTextBoxNom_TextChanged(object sender, TextChangedEventArgs e)
    {
        filtreNom.Value = (sender as WatermarkedTextBox).Text;
    }

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    876
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 876
    Par défaut
    Citation Envoyé par abbepierre94 Voir le message
    Je déterre un ancien de mes sujets car j'ai une nouvelle problématique similaire.
    J'essaie de faire une succession de .Where(...) à un moment où j'ai déjà rapatrié la table en base de données.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    // je rapatrie mes données en base
    myContext.GetMyTableQuery(myContext.GetMyTableQuery());
     
    // partons du fait que myContext est maintenant rempli
     
    var query = myContext.MyTables;
    query = query.Where(x => x.filter1 = tbFiltre1.Text)
    query = query.Where(x => x.filter2 = tbFiltre2.Text)
    Le code précédent ne compile pas sur les 2 dernières lignes :

    Je comprends à peu près le pourquoi de l'erreur, mais je ne vois pas comment m'en sortir.

    Merci d'avance !
    (oui je sais, je ne maîtrise pas bien ces classes )

    Bonjour,

    Je me demande si tu ne devrais pas remplacer ton "var query" par "IQueryable query" ? ça typerait ta variable query et comme tu sembles avoir un problème de cast...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requête sur plusieurs tables avec plusieurs WHERE
    Par zengarden dans le forum Requêtes
    Réponses: 16
    Dernier message: 18/03/2015, 10h01
  2. Requête SELECT Avec plusieurs WHERE
    Par jazzybluesy dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 31/10/2012, 10h56
  3. Réponses: 3
    Dernier message: 30/08/2011, 16h38
  4. Réponses: 10
    Dernier message: 26/10/2009, 15h02
  5. Ajouter des données avec .Net RIA Services
    Par Invité dans le forum Silverlight
    Réponses: 10
    Dernier message: 21/09/2009, 09h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo