2014-08-28 74 views
-2

我想在C#中使用LINQ編寫以下SQL查詢,獲得相同結果的最佳方法是什麼?SQL到LINQ條款

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上應該是唯一的,組合不應該重複。這個查詢是檢查哪些作業打破該規則

編輯:我的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 2014-08-28 20:55:34

+0

雖然您提供給我們參考的SQL很好,但我們也需要知道您在LINQ中擁有哪些功能,以確定您在哪裏陷入困境。 – user2366842 2014-08-28 20:56:46

+1

內部'HAVING'子句中的所有內容都屬於where子句。 – AaronLS 2014-08-28 20:59:10

回答

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 

再次就像你的SQL查詢,您的LINQ應首先應用WHERE子句:

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 2014-08-28 21:03:33

+0

目標是獲得一份工作清單。儘管這是我的原始查詢。 – Oxymoron 2014-08-28 21:28:40

+0

「您的問題的標籤在字段JOB和LINK上應該是唯一的」,請參閱僅針對作業的以前的編輯版本 – AaronLS 2014-08-28 21:32:17