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 :

Taille maximale d'une liste [MVVM]


Sujet :

Silverlight

  1. #1
    Membre régulier
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Novembre 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Novembre 2011
    Messages : 104
    Points : 103
    Points
    103
    Par défaut Taille maximale d'une liste
    Bonsoir à tous,
    je tente depuis le début d'après-midi (Grr) de place une autoCompleteBox dans une page qui permettrait de sélectionner une ville (parmis 36000).
    Un filtre sera appliqué en entrée avec une autre autoCompleteBox qui demande le département.
    Jusque là pas de soucis (pas trop en tous cas ...).

    Pour éviter des aller/retour inutiles dans ma BD (mais est-ce vraiment nécessaire ?), je souhaitais charger depuis mon ViewModel la liste complète des villes pour utiliser cette dernière dans le cadre de mon filtrage mais le site plante sans indication particulière juste au démarrage. Après étude, j'ai constaté que ma liste ne se remplissait pas. J'ai tout tenté pensant à ma BD ou mon service RIA.
    Puis je viens de m'apercevoir que si je filtre les 34 premier départements, j'ai bien ma liste qui se remplie.

    Conclusion : je ne peux pas placer plus de 15000 lignes dans ma liste (environ).

    Est-ce une contrainte que l'on peut dépasser ? et si oui, comment ??

    Merci d'avance,
    Frédéric

  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    bonjour,
    si tu pouvais mettre le morceau de code que tu utilises, une liste supporte facilement plus de 15000 éléments si ta pas des milliers de propriété ou d'énorme donnée (je crois la taille limite est de 1,5 go mais t'aurais eu une erreur dans ce cas là), cet aprem je travaillais avec une liste de 50000 éléments et aucun problème.

  3. #3
    Membre régulier
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Novembre 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Novembre 2011
    Messages : 104
    Points : 103
    Points
    103
    Par défaut
    Bonjour "John" !

    J'utiliser tout bêtement RIA services.

    Voici la structure de ma table (dans le domain service).

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
        [MetadataTypeAttribute(typeof(Commune.CommuneMetadata))]
        public partial class Commune
        {
     
            // Cette classe vous permet d'attacher des attributs personnalisés aux propriétés 
            // de la classe Commune.
            //
            // Par exemple, le code suivant marque la propriété Xyz en tant que
            // propriété requise et spécifie le format pour les valeurs valides*:
            //    [Required]
            //    [RegularExpression("[A-Z][A-Za-z0-9]*")]
            //    [StringLength(32)]
            //    public string Xyz { get; set; }
            internal sealed class CommuneMetadata
            {
     
                // Les classes de métadonnées ne sont pas conçues pour être instanciées.
                private CommuneMetadata()
                {
                }
     
                public int codeCommune { get; set; }
     
                public int codePostal { get; set; }
     
                public Departement Departement { get; set; }
     
                public int Departement_codeDepartement { get; set; }
     
                public EntityCollection<DepotConservation> DepotConservation { get; set; }
     
                public string nomCommune { get; set; }
     
                public EntityCollection<OA> OA { get; set; }
            }
        }
    Comme tu pourras le constater, la structure est très simple (4 champs). Les entityCollections sont crées pour répondre aux relations avec "OA" et "DepotConservation" (pour info, il y a seulement une 50aine d'"OA" et aucun dépôt).

    Maintenant le code d'appel (dans mon viewModel). Ici, j'ai filtré par Département. C'est si je retire le filtre que j'ai le soucis.
    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
             private void LoadListeCommunes()
              {
                      EntityQuery<Commune> CommuneQuery = _Context.GetCommuneQuery();
                      CommuneQuery = CommuneQuery.Where(x => x.Departement_codeDepartement == SelectedDep.codeDepartement).OrderBy(p => p.nomCommune);
                      _Context.Load(CommuneQuery, GetListeCommuneCallBack, null);
              }
     
     
      private void GetListeCommuneCallBack(LoadOperation<Commune> lo)
              {
                  if (lo.Entities.Count() > 0)
                  {
                          ListeCommunes = new ObservableCollection<Commune>(lo.Entities);
                  }
    }
    Si "lo.Entities.count" dépasse 15000 (environ), j'ai cette erreur.
    Celà dit, je viens de faire le test et je peux garder le filtre sans problème.
    Mais je voudrais quand même comprendre d'où vient le soucis...

    Bonne journée,
    Frédéric

  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
    T'as mis un point d'arrêt et vérifié que tu as tout dans ta "ListeCommunes" ?

  5. #5
    Membre régulier
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Novembre 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Novembre 2011
    Messages : 104
    Points : 103
    Points
    103
    Par défaut
    Salut Christophe,

    J'ai mis deux points d'arret.
    Le premier au niveau du _context.load,
    le suivant au niveau du test sur lo.entities.
    Il plante entre les deux ...

  6. #6
    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
    Ce n'est donc pas un problème de liste. Mais t'as bien une exception??
    As-tu mis un point d'arrêt côté serveur (dans ta méthode GetCommunes())?

  7. #7
    Membre régulier
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Novembre 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Novembre 2011
    Messages : 104
    Points : 103
    Points
    103
    Par défaut
    Je n'y ai simplement pas pensé ...

    Je vais tester ...

  8. #8
    Membre régulier
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Novembre 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Novembre 2011
    Messages : 104
    Points : 103
    Points
    103
    Par défaut
    Là, je suis perplexe !
    J'ai tenté de placer un point d'arrêt sur ma méthode GetCommune() mais il n'y passe pas.
    Ou alors, je ne place pas le point d'arrêt dans le bon fichier ? (je l'ai placé sur le domainService que j'ai créé côté serveur). J'ai fait une recherche et n'en trouve pas d'autre dans l'application.

    Pour aller plus loin, j'ai créé une page toute simple avec un dataGrid et un appel en code behind.

    et voici l'erreur obtenue :

    cResult result)
    Caused by: Une exception a été levée par la cible d'un appel.

    à System.Windows.Navigation.PageResourceContentLoader.EndLoad(IAsyncResult asyncResult)
    à System.Windows.Navigation.NavigationService.ContentLoader_BeginLoad_Callback(IAsyncResult result)

    Le code behind est tout simple :

    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
    namespace MonAppli.Views
    {
        public partial class Recherche : Page
        {
            MonAppliContext ct = new MonAppliContext();
            public Recherche()
            {
                dataGrid1.ItemsSource = ct.Communes;
                ct.Load(ct.GetCommuneQuery());
            }
     
            // S'exécute lorsque l'utilisateur navigue vers cette page.
            protected override void OnNavigatedTo(NavigationEventArgs e)
            {
            }
     
        }
    }

  9. #9
    Membre régulier
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Novembre 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Novembre 2011
    Messages : 104
    Points : 103
    Points
    103
    Par défaut
    Bonjour à tous !
    j'ai finalement trouvé ou était le pb.
    En fait le load Operation retourne une liste nulle car la taille de la liste dépasse les restrictions imposées par le tranfert de données de WCF.
    Heureusement, il est possible de jouer sur cette limite dans le web.config (section system.serviceModel) en y plaçant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     <behaviors> 
          <serviceBehaviors> 
            <!-- This allows a larger amount of data to be sent to the client from WCF --> 
            <behavior name=""> 
              <dataContractSerializer maxItemsInObjectGraph="2147483647"/> 
            </behavior> 
          </serviceBehaviors> 
        </behaviors>
    On peut (on doit ?) bien entendu limiter la taille à moins de 2,14 millions...

    La source Ici !

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

Discussions similaires

  1. taille maximale d'une base de données access
    Par boumbo73 dans le forum Access
    Réponses: 7
    Dernier message: 19/03/2008, 18h14
  2. [W3C] taille maximale pour une URL
    Par trotters213 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 01/08/2007, 11h46
  3. Taille maximale d'une chaine de caractère
    Par Etanne dans le forum ASP
    Réponses: 2
    Dernier message: 08/10/2006, 10h44
  4. taille maximale d'une base mysql
    Par calla29 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 26/07/2006, 13h59
  5. taille maximale d'une base de donnée paradox
    Par Anonymous dans le forum Paradox
    Réponses: 5
    Dernier message: 14/02/2004, 17h39

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