Я хотел бы понять, что я делаю неправильно с моим запросом GROUP BY
в Linq. Я пробовал много примеров (т. Е. Linq with group by having count), но я все еще получаю больше результатов (как пропускается WHERE
). Мой код выглядит так:LINQ with GROUP BY and HAVING COUNT
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();
Это дает 229 результатов (все записи). Запрос, который я хотел бы построить в Linq является:
SELECT Var3
FROM myTable
GROUP BY Var1, Var2, Var3
HAVING COUNT(*) > 1
Каким-то образом, запрос дает мне 27 результатов, но выражение Linq дает мне 229 (все). Когда я заменить Где/выберите часть выражения Linq к следующему, я получаю список с подсчетами, которые являются 2 или выше:
.Select(g => new { Item = g.Key, Count = g.Count() })
Но я не хочу список с пунктами (и подсчетами) и имеющим чтобы пройти этот список, я хотел бы, чтобы часть HAVING
работала в выражении Linq ...
Редактировать 2: Если вы посмотрите на LINQ Group By Multiple fields -Syntax help, это также работает для меня. Тем не менее, я получу список объектов с Var1, Var2, Var3 и Count. Из этого списка я хочу только Var3 объектов с графом выше 1.
Любой, кто может указать мне в правильном направлении?
Редактировать 1: Как я уже говорил в своем вступительном слове, вопрос Linq with group by having count не отвечает на мою проблему. Если я использую этот код, у меня все еще есть набор из 229 результатов вместо 27, которые на самом деле «дублируются» (что означает, что после группы, имеющей счет более 1).
Редактировать 3: В данный момент я использую следующее. Я нужны два заявления, и я думаю, что это странно, но, как было сказано выше, это, кажется, единственный способ, чтобы выбрать только те записи, имеющие счета> 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();
Обратите внимание, что вместо того, чтобы выбрать только var3, я решили выбрать значения Var1 и Var2 и сохранить их в SomeClass(). Это просто дополнение, выбор всего не помогает с созданием 1-го утверждения, чтобы получить этот выбор.
Редактировать 4: Я могу, конечно, принять .Where..
часть в переменной duplicates
и добавить ее в оператор querygroup
, тем самым делая все одно утверждение. Успех? Кажется, слишком много, но по крайней мере это работает.
Если кто-то может узнать, почему мне нужно 2 заявления, пожалуйста, подробно :)
Возможный дубликат [Linq с группой по количеству] (http://stackoverflow.com/questions/2078736/linq-with-group-by-having-count) –
Добавлен «редактирование» на мой вопрос , Как я сказал в своем вступительном слове, я попробовал, но это не дает мне «правильный» результат. – Tjab
Чтобы определить, есть ли проблема с переведенным SQL-запросом, попробуйте 'var testA = session.Query() .GroupBy (c => new {c.Var1, c.Var2, c.Var3}) ToList (); var test = testA.Where (g => g.Count()> 1). Выберите (g => g.Key.Var3) .ToList(); 'и посмотрите, что вы получите. –