2013-02-18 74 views
0

我想將SQL語句轉換成LINQ並有一定的難度。基本上,我試圖查詢保存產品導航數據的DataTable(ID爲&描述的4個類別級別,例如Men's> Jackets> Summer> Pullover)。導航類別應該按順序出現,而不是「重複」。我的意思是說,一旦數據行中出現描述時,它會再次發生,但一旦它變成另一個描述,它就不能變回以前的描述。我已經開發了訪問該SQL查詢,它似乎做什麼,我需要做對我的測試數據:重複LINQ/DataTable查詢

SELECT Count(Nav.Level1Text) AS CountOfLevel1Text, Nav.Level1ID, Nav.SO, Nav.DC, Nav.Language 
FROM Nav 
GROUP BY Nav.Level1ID, Nav.SO, Nav.DC, Nav.Language 
HAVING Count(Nav.Level1Text) > 1; 

這是我迄今爲止得到:

var query = from table in navTable.AsEnumerable() 
      group table by new 
          { 
           Cat1Id = table["Cat1Id"], 
           Cat1Text = table["Cat1Desc"], 
           SalesOrg = table["SalesOrg"], 
           DistChan = table["DistChan"], 
           Language = table["Language"] 
          } 
      into groupedTable 
      where groupedTable.Key.Cat1Text.Count() > 1 //Count doesn't exist 
      select new {Cat1Count = groupedTable.Key.Cat1Text.Count(), groupedTable.Key.Cat1Id, groupedTable.Key.SalesOrg, 
      groupedTable.Key.DistChan, groupedTable.Key.Language}; 

好像我非常接近,但是我對「哪裏」一塊有困難。我無法弄清楚如何獲得Level1Text的計數(沒有Cat1Text.Count方法,但是我將它留下來說明我認爲應該做什麼)。

編輯:所以我意識到我沒有解釋清楚,但查詢檢測到Cat1Id分配給2個不同的Cat1Desc時。這就是我所說的「重複」。例如,如果Cat1Id爲'1'且Cat1Desc爲'Mens',而Cat1Id爲'2'並且Cat1Desc爲'Womens',則該查詢應該讓我知道,因爲'Count(Cat1Desc)> 1'用不同的ID。

+0

這裏的難點在於關係數據庫表沒有序列的概念,更不用說重複了。它知道重複,但。我想你想在你分組的五個字段中檢測出「Nav.Level1Text」的重複項。 – 2013-02-19 08:18:17

回答

1

我想出瞭解決方案,並想後,以便其他人可以看到:

var query = from table in navTable.AsEnumerable() 
      group table by new 
      { 
       Cat1Id = table["Cat1Id"], SalesOrg = table["SalesOrg"], 
       DistChan = table["DistChan"], Language = table["Language"] 
      } 
      into groupedTable 
      where groupedTable.Select(x => x["Cat1Desc"]).Distinct().Count() > 1 
      select new 
      { 
       Cat1Count = groupedTable.Select(x => x["Cat1Desc"]).Distinct().Count(), 
       groupedTable.Key.Cat1Id, groupedTable.Key.SalesOrg, 
       groupedTable.Key.DistChan, groupedTable.Key.Language 
      }; 

從組中刪除「Cat1Desc」,然後在使用DISTINCT()是很重要的「其中」和'選擇'。

+0

請注意,您可以在'where'之前使用'let distinctCatDesc = groupedTable.Select(x => x [「Cat1Desc」])。Distinct()。Count()',然後在'where'和'select'而不是重新計算它。 – Servy 2013-02-21 14:56:54

+0

好點。謝謝! – CoolCriSyS 2013-02-22 15:34:42