0

我正在尝试将 SQL 语句转换为 LINQ 并且遇到了一些困难。基本上,我正在尝试查询包含产品导航数据的 DataTable(4 个类别级别的 ID 和描述,例如男士 > 夹克 > 夏季 > 套头衫)。导航类别应按顺序出现且没有“重复”。我的意思是,一旦描述出现在数据行中,它可能会再次发生,但是一旦它更改为另一个描述,它就不能再变回之前的描述。我在 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。这就是我所说的“重复”。例如,如果 Cat1Id 为“1”且 Cat1Desc 为“Mens”,然后出现 Cat1Id 为“2”且 Cat1Desc 为“Womens”,则此查询应该让我知道,因为“Count(Cat1Desc) > 1”使用不同的 ID。

4

1 回答 1

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() 很重要。

于 2013-02-21T14:51:01.957 回答