2017-10-02 2 views
0

Comment écrire une clause GroupBy qui récupérera plusieurs enregistrements de plusieurs à plusieurs relations?LINQ - Grouper sur une relation many-to-many

Je la structure suivante:

public class Failure{ 
    public virtual int IdFailure { get; set; } 
    public virtual Workstation Workstation{ get; set; } 
} 

public class Workstation{ 
    public virtual int IdWorkstation { get; set; } 
    public virtual IList<WorksocketWorkstation> WorksocketWorkstation { get; set; } 
} 

public class WorksocketWorkstation{ 
    public virtual int IdWorksocketWorkstation{ get; set; } 
    public virtual Worksocket Worksocket{ get; set; } 
    public virtual Workstation Workstation{ get; set; } 
} 

public class Worksocket { 
    public virtual int IdWorksocket { get; set; } 
    public virtual IList<WorksocketWorkstation> WorksocketWorkstation { get; set; } 
} 

Ce que je veux faire est de groupe échecs par Worksockets connexes, y compris les « doublons » résultant de plusieurs à-plusieurs, donc si j'ai une défaillance survenant sur Poste de travail affecté à trois Worksockets, je veux qu'il soit comptabilisé pour chacun de ces Worksockets. Actuellement, je suis en utilisant quelque chose comme ça pour obtenir mes résultats:

GetFailures().GroupBy(g => g.Workstation.WorksocketWorkstation.FirstOrDefault().Worksocket.IdWorksocket) 

Mais depuis que je suis en utilisant FirstOrDefault, chaque échec est prise en compte que pour Worksocket seule. J'ai essayé d'utiliser SelectMany à la place ou d'obtenir les données du côté de Worksockets, basé sur les questions similaires qui ont déjà été répondues ici, mais je ne peux pas envelopper mes idées et les ajuster à mes besoins, donc toute aide ou explication serait grandement appréciée.

+0

On dirait que vous n'avez pas une vraie relation de l'échec au travail. Par exemple si vous avez deux échecs liés à deux stations de travail différentes. Quand voulez-vous que ces échecs soient groupés? Lorsque les postes de travail ont au moins un même worksocket? Ou vous voulez montrer tous les worksockets et y mettre tous les échecs qui pourraient survenir. Juste peut-être parce que vous ne savez pas exactement - vous ne connaissez que le poste de travail. –

+0

Ajout de la propriété de navigation actuellement manquante 'public ICollection Failures {get; ensemble; } 'to' Workstation' devrait vous donner une meilleure idée de comment faire ce dont vous avez besoin à partir du côté 'Worksockets'. –

+0

@IvanStoev c'est dans mon projet, je l'ai simplement simplifié ici pour des raisons de clarté. Tu as raison - si j'essayais de faire ça du côté de Worksockets, ce serait vraiment nécessaire, mais dans mon cas, c'est une solution de dernier recours et je veux l'éviter si possible. Je fais déjà un regroupement similaire à partir du côté Failures en fonction d'autres paramètres. –

Répondre

1
GetFailures().SelectMany(g => g.Workstation.WorksocketWorkstation) 
      .GroupBy(g => g.Worksocket.IdWorksocket) 
+0

Ça marche! Merci beaucoup. Mon erreur en utilisant 'SelectMany' était que j'ai essayé de faire cela dans la clause' GroupBy'. –