2015-09-10 1 views
1

Sorte de question spécifique mais je ne savais pas trop comment l'aborder. J'ai une liste de pièces que j'essaie de regrouper d'abord par type, puis par propriétaire. Je fais ceci pour vérifier s'il y a des pièces en double pour un propriétaire donné et le type (qui ne devrait pas être possible ainsi je dois les élaguer dehors). En ce moment, mon code ressemble à ceci:Possibilité de faire deux Group Bys et une vérification if count dans une instruction LINQ lambda?

IQueryable<IGrouping<Guid, Room>> allRoomsByOwner = _dbContext.Rooms.GroupBy(x => x.OwnerId); 
     List<Room> duplicates = new List<Room>(); 
     foreach (IGrouping<Guid, Room> roomsByOwner in allRoomsByOwner) 
     { 
      IEnumerable<IGrouping<Guid, Room>> roomsOfOwnerByType = roomsByOwner.ToList().GroupBy(x => x.TypeId); 
      foreach (IGrouping<Guid, Room> grouping in roomsOfTypeByType) 
      { 
       if (grouping.Count() > 1) 
       { 
        duplicates.AddRange(grouping.ToList()); 
       } 
      } 
     } 

Je me demande s'il est possible de mettre tout cela en une seule déclaration LINQ? J'ai des choses similaires avant, mais pas tout à fait aussi complexe et n'utilisant pas deux groupes de bys. Merci.

Répondre

1

Vous pouvez regrouper plusieurs colonnes (OwnerId et TypeId) et aplatir les groupes avec plus d'un des éléments (en utilisant la méthode SelectMany) pour obtenir les doublons:

var duplicates = _dbContext.Rooms.GroupBy(x => new{x.OwnerId,x.TypeId}) 
           .Where(g=>g.Count()>1) 
           .SelectMany(g=>g.Skip(1))// If you like you can skip the first element as representative of the group and the treat the rest as a duplicate. 
           .ToList(); 
+0

donc je supprimer sauter si je veux choisir les deux doublons? Mais sinon, cela fera la même chose que le code ci-dessus? – SventoryMang

+0

Si vous supprimez le 'Skip' vous allez sélectionner tous les éléments de chaque groupe qui ont plus d'un élément, et oui si vous supprimez le' Skip' vous devriez obtenir le même résultat – octavioccl