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 / Silverlight : Récuperer tous les enregistrements d'une colonne dans une Table


Sujet :

Silverlight

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 61
    Points : 53
    Points
    53
    Par défaut RIA Services / Silverlight : Récuperer tous les enregistrements d'une colonne dans une Table
    Bonjour

    Je me suis mis aux RIA services ces derniers temps et j'arrive (presque) à tout faire fonctionner.

    Silverlight implémente DomainDataSource qui transmet les requètes pour :
    - récupérer tous les enregistrements d'une table (Select * From Employeurs) -> Retourne toute la table
    - récupérer un enregistrement (Select EmployeurId From Employeurs) -> Retourne un Employeur


    J'ai vérifié coté serveur l'éxécution de la requète et la Taille des données renvoyées au Client Silverlight

    Pour récupérer un seul enregistrement j'ai utilisé un FilterDescriptor

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <riaControls:DomainDataSource AutoLoad="False" d:DesignData="{d:DesignInstance my:Employeur, CreateList=true}" Height="0" Name="EmployeurDomainDataSource" QueryName="GetEmployeursQuery" Width="0">
      <riaControls:DomainDataSource.DomainContext>
        <my:aplusbDS />
      </riaControls:DomainDataSource.DomainContext>
      <riaControls:DomainDataSource.FilterDescriptors>
        <riaControls:FilterDescriptor x:Name="EmpFds" PropertyPath="EmployeurId" Operator="Contains" Value=""></riaControls:FilterDescriptor>
      </riaControls:DomainDataSource.FilterDescriptors>
    </riaControls:DomainDataSource>

    Je passe la valeur de EmployeurId dans le code et j'exécute la requète

    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    EmpFds.Value = SelectEmpCbx.Items(SelectEmpCbx.SelectedIndex)
    EmployeurDomainDataSource.Load()

    J'ai maintenant besoin de récupérer toutes les valeurs de la colonne (Field) EmployeurId, mais sans charger toutes les colonnes de la table entièrement.
    (Parce que ça fait un gros volume de données)
    Uniquement cette colonne donc !

    J'ai beau chercher je ne trouve pas
    (Recherge google : RIA services Retrieve One column from one table)

    Quelqu'un a déjà fait ça ? et pourrait m'indiquer

    Merci d'avance

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Points : 674
    Points
    674
    Par défaut
    T'as pas bcp cherché alors... :-)

    On peut ajouter une "projection" soit du côté client, en rajoutant un "select" derrière la requête appelée, ou alors le plus simple peut être c'est de créer une nouvelle requête côté serveur qui ne te chargera que ce que tu veux.

    Tu calques ça sur ton "GetEmployeurs" dans ton domainservice (côté serveur), en le renommant, et en ajoutant le select adéquat, ce qui donnerait qque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            public IQueryable<Employeur> GetEmployeursIds()
            {
                var ret = this.ObjectContext.Employeurs.Select(e=>EmployeurId);
                return ret;
            }


    Et à la place d'appeler "GetEmployeursQuery", tu appeleras "GetEmployeursIdsQuery" (qui sera généré pr toi côté client).

    A+

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 61
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par chrisdot Voir le message
    T'as pas bcp cherché alors... :-)

    On peut ajouter une "projection" soit du côté client, en rajoutant un "select" derrière la requête appelée, ou alors le plus simple peut être c'est de créer une nouvelle requête côté serveur qui ne te chargera que ce que tu veux.

    Tu calques ça sur ton "GetEmployeurs" dans ton domainservice (côté serveur), en le renommant, et en ajoutant le select adéquat, ce qui donnerait qque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            public IQueryable<Employeur> GetEmployeursIds()
            {
                var ret = this.ObjectContext.Employeurs.Select(e=>EmployeurId);
                return ret;
            }
    Et à la place d'appeler "GetEmployeursQuery", tu appeleras "GetEmployeursIdsQuery" (qui sera généré pr toi côté client).

    A+
    Merci pour la réponse
    Je suis pas très à l'aise avec la logique Linq (et les projections ...)

    Coté Client :

    La méthode Select n'est pas accessible dans le DomainContext

    Code vbnet : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim query As EntityQuery(Of Employeur) = From Emp In SelectEmpDmc.GetEmployeursQuery() Select !!!

    Coté Serveur :

    J'ai rajouté la requète comme tu l'indiques
    Code vbnet : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      Public Function GetEmployeursIds() As IQueryable(Of Employeur)
        Return Me.ObjectContext.Employeurs.Select(Function(e) e.EmployeurId)
      End Function
    -> Le Type de Retour n'est pas bon

    Si je modifie le Type de retour
    Code vbnet : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      Public Function GetEmployeursIds() As IQueryable(Of String)
        Return Me.ObjectContext.Employeurs.Select(Function(e) e.EmployeurId)
      End Function

    La méthode GetEmployeursIdsQuery() n'est pas générée pour le client (je suppose parce que le type n'est pas connu dans les métadatas)


    Evidement sur la base de données MSSQL la requète suivante fonctionne très bien
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT EmployeurId FROM Employeurs

    Je bloque à quel endroit ?

    Encore merci pour votre aide

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Points : 674
    Points
    674
    Par défaut
    Autant pour moi. Comme ce n'est pas une entité la demande ne peut pas être considérée comme un requête RIA standard.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            [Invoke]
            public List<int> GetEmployeursIds()
            {
                var ret = this.ObjectContext.Employeurs.Select(e=>EmployeurId).ToList();            
                return ret;
            }
    Ca marchera mieux.

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Points : 674
    Points
    674
    Par défaut
    Citation Envoyé par Navedac Voir le message
    Coté Client :

    La méthode Select n'est pas accessible dans le DomainContext

    Code vbnet : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim query As EntityQuery(Of Employeur) = From Emp In SelectEmpDmc.GetEmployeursQuery() Select !!!
    Il suffit d'inclure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    using System.ServiceModel.DomainServices.Client;

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 61
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par chrisdot Voir le message
    Il suffit d'inclure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    using System.ServiceModel.DomainServices.Client;
    J'avais bien inclus cette référence.

    Autre idée ?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 61
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par chrisdot Voir le message
    Autant pour moi. Comme ce n'est pas une entité la demande ne peut pas être considérée comme un requête RIA standard.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            [Invoke]
            public List<int> GetEmployeursIds()
            {
                var ret = this.ObjectContext.Employeurs.Select(e=>EmployeurId).ToList();            
                return ret;
            }
    Ca marchera mieux.
    Effectivement la solution coté serveur Fonctionne
    Je mets le code en VB pour ceux que ça peut dépanner.

    Code à ajouter coté Serveur :

    Code vbnet : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <Invoke()>
    Public Function GetEmployeursIds() As List(Of String)
      Return Me.ObjectContext.Employeurs.Select(Function(e) e.EmployeurId).ToList          
    End Function

    Code à ajouter coté Client :

    Code vbnet : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim InvokeOperation As InvokeOperation = SelectEmpDmc.GetEmployeursIds
    AddHandler InvokeOperation.Completed, AddressOf GetEmployeursIds_Completed

    Et quand l'opération de chargement est terminée on peut mettre à jour un Control

    Code vbnet : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub GetEmployeursIds_Completed(sender As Object, e As EventArgs)
      Dim EmpsIds As InvokeOperation(Of IEnumerable(Of String)) = sender
      SelectEmpCbx.ItemsSource = EmpsIds.Value
    End Sub

    J'ai vérifié la requète HTTP et ça renvoie la bonne quantité de données

    Merci Chrisdot pour ton aide.

    (ça reste un peu compliqué pour faire un Select en RIA services ! )

  8. #8
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par chrisdot Voir le message
    Il suffit d'inclure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    using System.ServiceModel.DomainServices.Client;
    Non, c'est System.Linq qu'il faut ajouter

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 61
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par Thomas Lebrun Voir le message
    Non, c'est System.Linq qu'il faut ajouter
    J'ai essayé coté client mais j'ai toujours le même erreur :

    ->
    La définition de la méthode Select n'est pas accessible dans ce contexte
    LE code pour rappel :

    Code vbnet : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim query As EntityQuery(Of Employeur) = From Emp In SelectEmpDmc.GetEmployeursQuery() Select Emp.EmployeurId

    La close Where fonctionne bien par contre.

  10. #10
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Ce code, tu l'écris côté client ou côté serveur ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim query As EntityQuery(Of Employeur) = From Emp In SelectEmpDmc.GetEmployeursQuery() Select Emp.EmployeurId

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 61
    Points : 53
    Points
    53
    Par défaut
    Non là c'est coté Client ...

  12. #12
    Membre éclairé
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Points : 674
    Points
    674
    Par défaut
    Citation Envoyé par Navedac Voir le message
    LE code pour rappel :

    Code vbnet : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim query As EntityQuery(Of Employeur) = From Emp In SelectEmpDmc.GetEmployeursQuery() Select Emp.EmployeurId

    La close Where fonctionne bien par contre.
    Bin, du coup c'est peut être juste parce que c'est pas le bon type de retour. On veut des int (en tout cas c'est ce qu'on demande à la requête) en retour et pas des "Employeurs", genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim query As IEnumerable(Of Int) = From Emp In SelectEmpDmc.GetEmployeursQuery() Select Emp.EmployeurId
    Ou un truc du style (pas l'ahbitude de VB)....

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 61
    Points : 53
    Points
    53
    Par défaut
    J'ai l'impression que c'est pas implémenté plutot.

    (Le champ EmployeurId c'est un champ clé composé de charactères, pas un int, peut être aurais je du le nommer EmployeurKey)

    La solution coté serveur fonctionne très bien.
    Par contre si on regénère la classe Domain Context les modifs sont a re-écrire.

Discussions similaires

  1. [SP-2010] récupérer les terme d'une colonne d'une liste dans une autre liste
    Par Noruk dans le forum SharePoint
    Réponses: 2
    Dernier message: 09/02/2015, 18h15
  2. Réponses: 2
    Dernier message: 23/03/2014, 12h05
  3. [Toutes versions] coller les données d'une plage d'une cellule dans une cellule d'une autre feuille[VBA]
    Par arthson dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 24/01/2012, 17h37
  4. Réponses: 3
    Dernier message: 10/08/2009, 17h39
  5. Trouver tous les retours à la ligne contenus dans une table
    Par Philofish dans le forum Langage SQL
    Réponses: 1
    Dernier message: 04/08/2008, 22h24

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