【发布时间】:2013-02-03 05:21:23
【问题描述】:
我正在尝试将 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};
看起来我已经很接近了,但是我在“where”部分遇到了麻烦。我不知道如何获取 Level1Text 的计数(没有 Cat1Text.Count 方法,但我把它留在里面来演示我认为它应该做什么)。
编辑:所以我意识到我没有很清楚地解释这一点,但是查询检测到何时将 Cat1Id 分配给 2 个不同的 Cat1Desc。这就是我所说的“重复”。例如,如果 Cat1Id 为“1”且 Cat1Desc 为“Mens”,然后出现 Cat1Id 为“2”且 Cat1Desc 为“Womens”,则此查询应该让我知道,因为“Count(Cat1Desc) > 1”使用不同的 ID。
【问题讨论】:
-
这里的难点在于关系数据库表没有序列的概念,更不用说重复了。它虽然知道重复。我认为您想在您分组的五个字段中检测
Nav.Level1Text的重复项。
标签: c# sql linq datatable group-by