2014-08-28 3 views
-2

Я пытаюсь написать следующий SQL-запрос в C# с помощью LINQ, какой лучший подход получить тот же результат?SQL to linq having Clause

SELECT [t1].[JOB] 
FROM (
    SELECT COUNT(*) AS [value], [t0].[JOB], [t0].[LINK], [t0].[PREFIX] 
    FROM [dbo].[LABELS] AS [t0] 
    GROUP BY [t0].[JOB], [t0].[LINK], [t0].[PREFIX] 
    HAVING [t0].[PREFIX] = 'B' AND [t0].[LINK] != 0 
    ) AS [t1] 
GROUP BY [t1].[JOB], [t1].[value] 
HAVING [t1].[value] > 1 

Этикетки должны быть уникальными в полях JOB и LINK, комбинация никогда не должна повторяться. Этот запрос проверяет, какие JOBs нарушают это правило

Редактировать: Мой LINQ по запросу не дает ожидаемого результата.

dbP.PackagingLabels.GroupBy(l => new {l.JOB, l.LINK, l.PREFIX}) 
    .Where(g => g.Select(e => e.PREFIX != "B" && e.LINK != 0).Count() > 1) 
    .Select(g => g.Key.JOB); 
+2

Что вы пытались сделать до сих пор, чтобы решить эту проблему, и какие у вас проблемы с вашим решением? – Servy

+0

Хотя хорошо, что вы предоставили нам SQL для справки, нам также нужно знать, что у вас есть в LINQ, и посмотреть, где именно вы застреваете. – user2366842

+1

Все, что содержится во внутреннем разделе 'HAVING', принадлежит вместо предложения where. – AaronLS

ответ

1

Похоже, что вы могли бы упростить это сильно:

SELECT COUNT(*) AS [counts], [t0].[JOB], [t0].[LINK] 
FROM [dbo].[LABELS] AS [t0] 
WHERE [t0].[PREFIX] = 'B' AND [t0].[LINK] != 0 
GROUP BY [t0].[JOB], [t0].[LINK] 
HAVING COUNT(*) > 1 

Опять же, как ваш запрос, ваш LINQ следует применять ИНЕК первый:

var groupsOfDupes = dbP.PackagingLabels 
    .Where(e => e.PREFIX != "B" && e.LINK != 0) 
    .GroupBy(l => new {l.JOB, l.LINK}) 
    .Where(grp => grp.Skip(1).Any()) //this returns true if there is more than one item in the group 
    .ToList(); 

Это даст вам список групп. Обратите внимание, что каждый элемент в списке сам является списком. Внутренний список - это элементы, которые имеют одинаковые JOB и LINK.

foreach(var group in groupsOfDupes) 
{ 
    Console.WriteLine("This combination has count > 1: { JOB: '" + group.Key.JOB + "', LINK: '" + group.Key.LINK + "' } with count of: " + group.Count()); 
} 
+2

Это может быть так, но он все еще не полностью отвечает на заданный вопрос. – user2366842

+0

Целью является получение списка заданий. Это был мой первоначальный запрос. – Oxymoron

+0

«Ярлыки должны быть уникальными в полях JOB и LINK» из вашего вопроса, см. Предыдущую редакционную ревизию только для заданий – AaronLS