2013-02-18 76 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