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

Accès aux données Discussion :

[Linq to sql] Exception sur Count


Sujet :

Accès aux données

  1. #1
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut [Linq to sql] Exception sur Count
    Bonjour,

    je me mets à linq, et je suis donc ce tuto pour découvrir ses possibilités : http://morpheus.developpez.com/linq/. VS 2008 refuse d'ouvrir le projet, j'imagine que l'exemple a été rédigé avec une version beta ?!

    J'ai donc sagement copié/collé le code du pdf, comparé avec le fichier .cs du source exemple, pas de différence... Par contre obligé de faire gicler les propriétés Id et Autogen de l'attribut Column, sinon compile pas (ça date de la version beta de linq ça aussi ?)

    Actuellement à la page 29/30, je tente de compter les orders d'un employé...

    Quand je lance l'exécution, je me mange un exception sur l'appel sur Count

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                foreach (Employees employee in EmployeeList)
                {
                    Console.WriteLine("EmployeeId: {0}\t Employee LastName: {1} Quantity : {2}",
                  employee.EmployeeId, employee.LastName, employee.OrdersForEmployee.Count);
                }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Count 'employee.m_Orders.Count' threw an exception of type 'System.InvalidOperationException'	int {System.InvalidOperationException}
     
    {"No coercion operator is defined between types 'System.String' and 'System.Int32'."}	System.SystemException {System.InvalidOperationException}
    Quelqu'un peut me dire pourquoi ?

    Merci

  2. #2
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Salut,

    Et en mettant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    employee.OrdersForEmployee.Count.ToString()
    Count étant un entier, le problème semble venir de là.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par binoo Voir le message
    Salut,

    Et en mettant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    employee.OrdersForEmployee.Count.ToString()
    Count étant un entier, le problème semble venir de là.
    Non, Console.WriteLine accepte des paramètres de n'importe quel type... il remplace implicitement {0}, {1} et {2} par le résultat du ToString des paramètres.

    Je me demande si c'est pas plutôt un problème de mapping, par exemple une relation avec des colonnes de types différents

  4. #4
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    Rien que l'exception InvalidOperationException est singulière...

    Par contre, il suffit de préciser ThisKey et OtherKey sur 'attribut Column de chaque élément de jointure ? IL n'y a pas à spécifier la table cible ?

  5. #5
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    Je viens de changer le code suivant pour la sélection des données : afficher les id de commandes de chacun plutôt que le nombre de commandes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    foreach (Employees employee in EmployeeList)
                {
                    //Console.WriteLine("EmployeeId: {0}\t Employee LastName: {1}\t Quantity : {2}",
                  //employee.EmployeeId, employee.LastName, employee.OrdersForEmployee.Count);
                    foreach (Orders order in employee.OrdersForEmployee)
                        Console.WriteLine("EmployeeId: {0}\t Employee LastName: {1}\t NumOrder: {2}",
                            employee.EmployeeId, employee.LastName, order.OrderID); 
                }
    Or ça me fait le même bug... Donc le souci est à la récupération des orders de l'employé...

    Employee.cs :
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    [Table(Name = "Employees")]
        public class Employees
        {
            private int m_EmployeeId;
            private string m_EmployeeLastName;
            private EntitySet<Orders> m_Orders;
     
            public Employees()
            {
                this.m_Orders = new EntitySet<Orders>();
            }
     
            [Association(Storage = "m_Orders", OtherKey = "EmployeeId")]//, Name = "FK_Orders_Employees")]
            public EntitySet<Orders> OrdersForEmployee
            {
                get { return this.m_Orders; }
                set { this.m_Orders.Assign(value); }
            }
     
     
            [Column(IsPrimaryKey = true, Name = "EmployeeId")]
            public int EmployeeId
            {
                get
                {
                    return m_EmployeeId;
                }
                set
                {
                    m_EmployeeId = value;
                }
            }
     
            [Column(Storage = "m_EmployeeLastName", Name = "LastName")]
            public string LastName
            {
                get
                {
                    return m_EmployeeLastName;
                }
                set
                {
                    m_EmployeeLastName = value;
                }
            }
        }
    Order.cs :
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
        [Table(Name="Orders")] 
        public class Orders 
        { 
              private int m_OrderID; 
            private string m_EmployeeID; 
            private EntityRef<Employees>m_Employee; 
     
            public Orders() 
            { 
                  this.m_Employee = new EntityRef<Employees>(); 
              }
     
              [Column(Storage = "m_OrderID", DbType = "Int NOT NULL IDENTITY", IsPrimaryKey = true)] 
              public int OrderID 
              { 
                get 
                { 
                  return this.m_OrderID; 
                } 
              } 
     
              [Column(Storage="m_EmployeeID", DbType="NChar(5)")] 
              public string EmployeeId 
              { 
                get 
                { 
                  return this.m_EmployeeID; 
                } 
                set 
                { 
                  this.m_EmployeeID = value; 
                } 
              }
     
              [Association(Storage = "m_Employee", ThisKey = "EmployeeId")] 
              public Employees Employee 
              { 
                get 
                { 
                  return this.m_Employee.Entity; 
                } 
                set 
                { 
                  this.m_Employee.Entity = value; 
                } 
              } 
        }

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Je connais pas bien Linq to SQL, mais à mon avis il manque des infos dans tes attributs d'association...
    Tu passes par le designer ou tu définis les attributs à la main ?

  7. #7
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    A la main sinon c'est pas drôle

    je me doute aussi que l'association pose problème, j'ai tenté d'ajouter le Name="foreign_key" sans succès...

  8. #8
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Salut,

    Citation Envoyé par tomlev
    Non, Console.WriteLine accepte des paramètres de n'importe quel type...
    Oui c'est juste...

    Citation Envoyé par Arnard
    A la main sinon c'est pas drôle

    je me doute aussi que l'association pose problème, j'ai tenté d'ajouter le Name="foreign_key" sans succès...
    Ah encore un qui aime se faire du mal

    Sinon non je ne pense pas que ça vienne de l'association, elle est bien faite il me semble.

    Dans la classe Orders, tu définis une propriété EmployeeId de type string et celle-ci devrait être de type int (comme en base et dans la classe Employees) :

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        private int m_EmployeeID; 
     
        [Column(Storage = "m_EmployeeID", DbType = "Int")]
        public int EmployeeId {
          get {
            return this.m_EmployeeID;
          }
          set {
            this.m_EmployeeID = value;
          }
        }

    Il y aurait une petite erreur dans le tuto ? Thomas va peut-être passé par là

  9. #9
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    En effet, je l'ai trouvé entre temps en faisant d'autres manips...

    Finalement j'ai résolu mon souci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Table<Employees> employees = db.GetTable<Employees>();
                Table<Orders> orders = db.GetTable<Orders>();    
     
                IQueryable<Employees> EmployeeList = (from e in employees
                                                      join o in orders on e.EmployeeId equals o.EmployeeId
                                                      select e).Distinct<Employees>().OrderBy(e => e.LastName);
     
     
     
                foreach (Employees employee in EmployeeList)
                {
                    Console.WriteLine("EmployeeId: {0}\t Employee LastName: {1}\t ID First Commande : {2}",
                        employee.EmployeeId, employee.LastName, employee.OrdersForEmployee.First<Orders>().OrderID);
                }
    Donc obligé de traiter la jointure dans la requête , alors que je pensais que ce traitement était sous-entendu

    De même, obligé de faire le distinct en fonction, au lieu d'un groupe by dans la requête en elle-même, sinon il me sort autant d'employés que de orders associés (normal )

    Par contre retrouver sa liste de Orders dans employee remplie, pis sélectionner un order, et afficher les infos de l'employé, c'est une tuerie ^^

    Bon, se pose la question du volume de requêtes, pour 9 pèlerins, 10 requêtes(et plus si affinité), et on a nos objets, ca fait un poil lourdingue, par contre "l'utilisabilité" est bien au rendez-vous ^^

    Sinon oué, j'adore me prendre la tête, sérieux, je préfère voir le fonctionnement interne avant de me lancer sur un éditeur graphique !

    Enfin oué, correctifs à apporter sur le tuto (et les projets en sources fournis avec sont inutilisables car il dit "projet importé introuvable : pgfiles\LINQ\Preview\Misc\Linq.targets"

    Merci à tous

  10. #10
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Pour la défense du tutoriel, il date maintenant (08/08/2006, autant dire que c'était les prémisses de Linq et donc une version béta). Les principes sont tout de même là .

    Sinon t'as bien raison de plonger en profondeur dans le sujet .

  11. #11
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    On est bien d'accord, ça apporte une bonne compréhension du concept. Je me suis douté de la version beta (cf plus haut), quand j'ai vu l'utilisation d'attributs inconnus pour VS2008.

    Dernière question : Le Name dans AssociationAttribute pour indiquer la foreign key, c'est uniquement décoratif alors ?! Il n'y a aucune exploitation faite derrière ? Ou je me trompe (dans ce cas-là je veux bien une explication ^^)

  12. #12
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut
    Visiblement ce tuto était fait pour 3.0 et non 3.5, des modifications ont été apportées entre-temps.

    C'est pour ça que j'ai aussi eu des soucis...

    Mais ce tuto est assez utile pour débuter et se donner une idée des possibilités.

    Reste plus qu'à trouver des vrais cas, avec des vrais problèmes bien "chi..." pour appliquer et approfondir...

    "myBoss, je voudrais une mission en 3.5 + LinQ svp."

  13. #13
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    Ah nan moi c'est cool, les boss veulent du 3.5, les clients aussi, du bonheur pour se former

    D'ailleurs faut que j'étudie les relations entre linq to SQL et WCF maintenant xD

  14. #14
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut
    Citation Envoyé par Arnard Voir le message
    Ah nan moi c'est cool, les boss veulent du 3.5, les clients aussi, du bonheur pour se former

    D'ailleurs faut que j'étudie les relations entre linq to SQL et WCF maintenant xD

    voilà des gens bien !!!

    même si - parait-il - le 4.0 est sur le grill !

    et dire qu'on m'a anvoyé chez un client qui voulait du VB6
    Euh... moi c'est pas VB mais C# que j'ai dit...

  15. #15
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    Bah développement on embauche xD
    Sinon, de ce que j'ai compris, le Framework 4 s'intéressera plus à ce qui est architectures parallèles !

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

Discussions similaires

  1. Linq to Xml [Exception sur un attribute]
    Par Skaiwakh dans le forum Linq
    Réponses: 3
    Dernier message: 17/06/2011, 14h10
  2. Réponses: 0
    Dernier message: 17/05/2010, 17h48
  3. Réponses: 2
    Dernier message: 02/03/2010, 23h32
  4. [Linq to sql] Exception sur Count
    Par Arnard dans le forum Linq
    Réponses: 14
    Dernier message: 27/10/2008, 15h59
  5. [Linq to SQL] Transactions sur plusieurs DataContext
    Par anthyme dans le forum Accès aux données
    Réponses: 2
    Dernier message: 03/06/2008, 14h58

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