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

Linq Discussion :

Problème requête Linq - Many To Many


Sujet :

Linq

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2008
    Messages : 121
    Points : 84
    Points
    84
    Par défaut Problème requête Linq - Many To Many
    Bonjour à vous,
    J'ai un petit(Gros) problème avec ma requête LINQ et EntityFramework.

    J'ai dans le relation principale 3 table :
    • Schedule (qui est le noeud de toutes les relations)
    • Group (la liste des groupes)
    • Group_To_GroupOption (ma table de relation pour qu'une option puisse avoir plusieurs parents)


    Nom : Schema.png
Affichages : 150
Taille : 6,8 Ko


    Dans ma classe entité Schedule
    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
     
            Public Sub New()
                Me.Parents = New List(Of Schedule)
                Me.Options = New List(Of Schedule)
            End Sub
          {...}
            Public Overridable Property Parents As ICollection(Of Schedule)
            Public Overridable Property Options As ICollection(Of Schedule)
     
        Public Function GetGroupOptions() As IEnumerable(Of Group)
                If Options IsNot Nothing Then
                    Return Options.Select(Function(f) f.Group)
                End If
                Return Nothing
            End Function
    Pour le mapping de Schedule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
               Me.HasMany(Function(t) t.Options).
                    WithMany(Function(t) t.Parents).
                    Map(Sub(m)
                            m.ToTable("act_Group_To_GroupOption")
                            m.MapLeftKey("parent_id") 
                            m.MapRightKey("groupOption_id")
                        End Sub)
    Vu que s'est une relation Many-To-Many je n'ai pas créer de classe entité/mapping pour Group_To_GroupOption.

    Si je regarde une entité unique dans LINQ tous passe sans problème.


    Mon problème est pour ma requête principale qui obtient la liste des activité (oui je n'ai pas mis cette table, mais elle n'est pas la cause du problème). Dans cette classe entité, j'ai la liste de tous les groupes qui y sont attaché.
    1. Obtient la liste des activités
    2. Obtient la liste des groupes de activités (qui ne sont pas une options)
    3. Obtient la liste des options de chaque groupes (ici que ca plante)


    Si je retire le code de la 3e étape. Tous passe niquel.


    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
    Dim activityList = (From a In Me.Activities.Include(Function(a) a.Group).Include(Function(a) a.ActivityType).Include(Function(a) a.Activityrestrictiondate)
    							From ar In a.ActivityResources
    							Where a.owner_organization_id = _OrganizationId
    							Select New With {
    								.ActivityLabel = If(String.IsNullOrEmpty(ar.Name), a.name, ar.Name),
    								.ActivityId = a.id,
    								.ActivityDescription = If(String.IsNullOrEmpty(ar.Description), a.description, ar.Description),
    								.ActivityTypeId = a.ActivityType.id,
    								.ParentActivityTypeId = If(a.ActivityType.act_type_id Is Nothing, a.ActivityType.id, a.ActivityType.act_type_id),
    								.ActivityGroups = (From g In a.Group
    												   From gr In g.GroupResources
    												   From sr In g.Session.SessionResources
    												   Let IsOption = (g.Schedule.Parents.Count > 0)
    												   Where gr.Culture_id = CultureId And sr.Culture_id = CultureId And Not IsOption And g.publish = 1 And g.status = "lblactive"
    												   Select New With {
    													   .ActivityGroupId = g.schedule_id,
    													   .GroupName = If(String.IsNullOrEmpty(gr.Name), g.name, gr.Name),
    													   .GroupOptions = (From x In g.Schedule.GetGroupOptions
    																		 Select New With {
    																			 .ActivityId =  x.activity_id,
    																			 .ActivityGroupId = x.schedule_id,
    																			 .GroupName = x.name})
                                                                        })
                                }).ToList
    J'obtiens l'erreur suivante :
    LINQ to Entities ne reconnaît pas la méthode « System.Collections.Generic.IEnumerable`1[ACT.CommonToolkit.DataAccess.Models.Group] GetGroupOptions() », et cette dernière ne peut pas être traduite en expression de magasin.
    J'ai essayé en mettant au lieu de la méthode GetGroupOption : g.Schedule.Options.Select(function(f) f.Group)

    Dans ce cas, j'obtiens l'erreur suivante :
    The column 'schedule_id3' was specified multiple times for 'Join8'.
    The column 'schedule_id3' was specified multiple times for 'Filter6'.


    Initialement, un groupe ne pouvait avoir qu'un parent. Donc, j'avais un champs (parent_id) dans le groupe. Mais ce dernier a été retiré.

    Donc des experts parmi vous qui ont une solution magique a mon problème ? Disons qu'après 2 jours de recherche et d'essai erreur je commence a désespérer


    Merci d'avance
    P.S : Est-ce qu'avec ma structure j'aurai moyen de faire le mapping (Parent/Option) directement dans l'entité Group ?

  2. #2
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2008
    Messages : 121
    Points : 84
    Points
    84
    Par défaut
    Bonjour,
    Je ne sais pas trop pourquoi, vu qu'a la base je pensais que le Mappings faisait comprendre qu'elle était les FK. Mais en remplacant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            Public Overridable Property Parents As ICollection(Of Schedule)
            Public Overridable Property Options As ICollection(Of Schedule)
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            <ForeignKey("parent_id")> _
            Public Overridable Property Parents As ICollection(Of Schedule)
            <ForeignKey("groupOption_id")> _
            Public Overridable Property Options As ICollection(Of Schedule)
    Ça fonctionne :/

    Voila, je mets la solution des fois que ca fonctionnerai aussi pour quelqu'un autre un jour

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

Discussions similaires

  1. [AC-2007] Problème Relation many-to-many-to-many
    Par Synystrose dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 12/08/2015, 10h57
  2. problème requête linq et combobox
    Par C2010 dans le forum C#
    Réponses: 1
    Dernier message: 27/12/2011, 13h59
  3. [EJB 3.0] Problème requête many to many
    Par NameX dans le forum JSF
    Réponses: 1
    Dernier message: 29/08/2011, 16h00
  4. Problème avec Composite-Id (mapping many-to-many))
    Par ammouna24 dans le forum Hibernate
    Réponses: 0
    Dernier message: 07/05/2009, 11h43
  5. Un peu de mal a comprendre le concepte "one-to-many" et "many-to-many"
    Par chriscoolletoubibe dans le forum Hibernate
    Réponses: 4
    Dernier message: 29/03/2007, 18h50

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