重复的LINQ / DataTable查询

时间:2013-02-18 17:33:12

标签: c# sql linq datatable group-by

我正在尝试将SQL语句转换为LINQ并遇到一些困难。基本上,我正在尝试查询保存产品导航数据的DataTable(ID和描述的4个类别级别,例如Men's> Jackets> Summer>套衫)。导航类别应按顺序显示,而不是“重复”。我的意思是,一旦描述发生在数据行中,它就会再次发生,但是一旦它改变到另一个描述,它就不能改回到之前的描述。我在Access中开发了这个SQL查询,它似乎做了我需要它对我的测试数据做的事情:

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。这就是我所说的“重复”。例如,如果Cat1Ic为'1'且Cat1Desc为'Mens',然后Cat1Id为'2'且Cat1Desc为'Womens',则此查询应该让我知道,因为'Count(Cat1Desc)> 1'具有不同的ID。

1 个答案:

答案 0 :(得分: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”然后在“where”和“select”中使用Distinct()非常重要。