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)
Dans ma classe entité Schedule
Pour le mapping de 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
Vu que s'est une relation Many-To-Many je n'ai pas créer de classe entité/mapping pour Group_To_GroupOption.
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)
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é.
- Obtient la liste des activités
- Obtient la liste des groupes de activités (qui ne sont pas une options)
- Obtient la liste des options de chaque groupes (ici que ca plante)
Si je retire le code de la 3e étape. Tous passe niquel.
J'obtiens l'erreur suivante :
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'ai essayé en mettant au lieu de la méthode GetGroupOption : g.Schedule.Options.Select(function(f) f.Group)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.
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 ?
Partager