LINQ avec GROUP BY et HAVING COUNT

J'aimerais comprendre ce que je fais de mal avec mon GROUP BY requête Linq. J'ai essayé de nombreux exemples (c'est à dire Linq avec le groupe en ayant comte), mais je reçois encore plus de résultats (comme c'est le WHERE est ignorée). Mon code ressemble à ceci:

var test = session.Query<SomeClass>()
                  .GroupBy(c => new { c.Var1, c.Var2, c.Var3 })
                  .Where(g => g.Count() > 1)
                  .Select(g => g.Key.Var3)
                  .ToList();

Cela donne 229 résultats (tous les enregistrements). La requête que je voudrais construire dans Linq est:

SELECT Var3
FROM myTable
GROUP BY Var1, Var2, Var3
HAVING COUNT(*) > 1

D'une certaine manière, la requête me donne 27 résultats, mais l'expression Linq me donne 229 (tous). Lorsque je remplace le où/sélectionner une partie de l'expression Linq pour le suivant, je reçois une liste avec les chefs d'accusation qui sont 2 ou plus:

.Select(g => new { Item = g.Key, Count = g.Count() })

Mais je ne veux pas une liste avec les objets (et chiffres) et d'avoir à passer par cette liste, j'aimerais avoir la HAVING partie du travail dans l'expression Linq...

Edit 2: Si vous jetez un oeil à LINQ Groupe Par de Multiples champs -Syntaxe de l'aide, cela fonctionne aussi pour moi. Cependant, je vais obtenir une liste d'objets avec Var1, Var2, Var3, et à Compter. De cette liste, je ne veux Var3 des objets avec un nombre supérieur à 1.

Quelqu'un qui peut me pointer dans la bonne direction?

Edit 1: Comme je l'ai dit dans mon introduction, la question Linq avec le groupe en ayant comte n'est pas de répondre à mon problème. Si j'utilise ce code, j'ai encore un ensemble de 229 résultats au lieu de le 27 qui sont en fait des "dupliqué" (ce qui signifie, d'après le groupe ayant un nombre supérieur à 1).

Edit 3: je suis l'aide de la suite en ce moment. J'ai besoin de deux états, et qui, je pense, c'est bizarre, mais comme l'a dit avant, ce qui semble être la seule façon de sélectionner uniquement les enregistrements ayant le compte > 1.

var querygroup = session.Query<SomeClass>()
                        .GroupBy(e => new { e.Var1, e.Var2, e.Var3 })
                        .Select(s => new { s.Key.Var1, s.Key.Var2, s.Key.Var3, Count = s.Count() })
                        .ToList();

var duplicates = querygroup.Where(g => g.Count > 1)
                           .Select(g => new SomeClass() { Var1 = g.Var1, Var2 = g.Var2, Var3 = g.Var3})
                           .ToList();

Remarque qu'au lieu de sélectionner uniquement Var3, j'ai décidé de sélectionner les valeurs Var1 et Var2 aswell et de les stocker dans le SomeClass(). C'est juste un plus, la sélection de tout ce qui n'aide pas à la création de 1 pour obtenir cette sélection.

Edit 4: je peux bien sûr prendre le .Where.. partie dans le duplicates variable et l'ajouter à la querygroup déclaration, ce qui rend l'ensemble d'un énoncé. Le succès? Semble exagéré, mais au moins il fonctionne.

Si quelqu'un peut savoir pourquoi j'ai besoin de 2 états, veuillez préciser 🙂

Double Possible de Linq avec group by having count
Ajout d'une "modifier" à ma question. Comme je l'ai dit dans mon introduction, je l'ai essayé mais il ne veut pas me donner les "bons" résultats.
Afin de déterminer si le problème est avec la traduction de la requête SQL, essayez var testA = session.Query<SomeClass>().GroupBy(c => new { c.Var1, c.Var2, c.Var3 }).ToList(); var test = testA.Where(g => g.Count() > 1).Select(g => g.Key.Var3).ToList(); et voir ce que vous allez obtenir.
ici, je reçois une erreur de requête sur le groupe, il faut sélectionner depuis le "id" de la colonne ne fait pas partie de la déclaration du GROUPE.
Ah, donc ce n'est ni de LINQ to SQL ou EF, mais NHibernate. Ces choses sont importantes, vous devriez tag à la question correctement, parce que chaque ORM mappeur a des détails (et les bugs). Il n'y a rien de plus que nous pouvons faire ici, bonne chance.

OriginalL'auteur Tjab | 2016-04-04