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 🙂
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
Vous devez vous connecter pour publier un commentaire.
Essayer cette
SELECT Var3 FROM table GROUP BY Var1, Var2, Var3 HAVING COUNT(*) > 1
quand j'enlève leHAVING
partie.Encore mieux, dans votre exemple, si je change de sélectionner une partie de
.Select(g => g.records.Count())
, j'obtiens une liste de 229 (tous) les dossiers, quelque chose comme1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,5,1,1,1,1,1
etc (27 fois PAS de 1). Je suis très perturbée par ce, depuis que je tiens pour ne sélectionner que les PAS des enregistrements 1....J'ai mis à jour la réponse..donner aussi essayer....J'ai matérialisé les dossiers en faisant ToList...je sens qu'il y a un problème qui se passe en raison de différés d'exécution..C'est plus de l'intuition de lui donner un try..By regards de votre requête en question devrait fonctionner.
Ne semble pas fonctionner (problèmes avec la ToList pour le moment). Je vais mettre à jour la question et donner une réponse (solution) pour l'instant, avoir deux requêtes qui fonctionnent pour donner la réponse dont j'ai besoin.
OriginalL'auteur Viru
Vous pouvez essayer dans la Linqpad. J'ai modifié la table et de la colonne nom de votre requête pour correspondre à l'encontre de mes propres DB:
C'était la requête SQL il produit:
Pas un seul avec le COMTE, mais OÙ au lieu de cela, et fonctionnellement identiques. En jouant avec le @p0 paramètres montre que la sortie est filtré correctement.
Je vous recommande d'essayer avec Linqpad pour voir ce que votre requête ne l'encontre de vos données.
HAVING
à l'intérieur de la sous-requête.vous êtes de droite. J'ai corrigé ma réponse.
OriginalL'auteur Wicher Visser
Donc, la réponse à ma question:
Semble un peu exagéré, je pense que ça pourrait être plus petit, donc si quelqu'un aime un commentaire sur ce que...
OriginalL'auteur Tjab