按查询分组,每个组不能有任何不在列表中的项目

Group by query, each group has to not have any item not in a List

需要一个可以帮助我解决这个问题的查询。

这是我的 table 'tags':

我将 'tags' table 的结果按 hardware_id 分组。我还有一个标签列表 (List<string>)。

我想获取自定义列表中所有标签在上面 table 中的 name 匹配的组的硬件 ID。

换句话说,我想获得自定义列表标签与其 name 相匹配的 hardware_id。自定义列表中可能有 name 没有匹配项,但所有自定义列表标签都必须在组中,如果满足此需求,我可以获取该组的 Id .

我发现很难解释,也没有得到答案。我想过用foreach来做,因为它很难解决,但我也做不到,而且这样做效率很低。

示例:

列表:['tag1'、'tag2']

Table 行:

1, tag1, 5, 1
2, tag2, 5, 1
3, tag3, 5, 1
4, tag4, 5, 2
5, tag5, 6, 2

在这种情况下,我应该得到 1 的 hardware_id,因为虽然其中一个硬件 ID 有 tag3,但它没有任何行的标签名称不在列表中。如果列表有 'tag4',hardware_id = 1 将不会被 return 编辑,因为列表有一个标签,而 hardware_id 组没有。

如果组中没有列表中的项目,则它不会出现在最终结果中。

有人跟我玩这个代码,但没用:

 List<decimal> matchingHardareIds = db.tags.GroupBy(x => x.hardware_id)
      .Where(x => x.All(s => tags.Contains(s.name.ToLower()) || 0 == tags.Count() && (s.user_id == userId)))
      .Select(x => x.Key).ToList();

在那个查询中,当我在列表和 table 中有一个标签时,我有几个项目 hardware_id 1,其中一个有一个 'name' 是相等的到列表中的值,它将 return 空结果。这是因为 hardware_id 的特定组的 table 中的行有一个名称未出现在自定义列表中的行。

我需要在 Entity Framework 或 Linq 中进行查询。非常感谢。

无法为您提供 entity framework 或 linq 查询,但 sql 解决方案是这样计算匹配项:

SELECT hardware_id 
FROM tags
WHERE name IN (<list>)
GROUP BY hardware_id
HAVING COUNT(DISTINCT name) = <listDistinctCount>

<listDistinctCount> 是列表中不同值的计数。您可以在查询之前准备好。

使用这个:

var t = db.tags.GroupBy(x => x.hardware_Id)
          .Where(x => tags.All(y => 
                          x.Any(z=> z.name == y)))
          .Select(x=>x.Key).ToList();