按查询分组,每个组不能有任何不在列表中的项目
Group by query, each group has to not have any item not in a List
需要一个可以帮助我解决这个问题的查询。
这是我的 table 'tags':
- id(整数)
- 姓名(字符串)
- user_id(整数)
- hardware_id(整数)
我将 '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();
需要一个可以帮助我解决这个问题的查询。
这是我的 table 'tags':
- id(整数)
- 姓名(字符串)
- user_id(整数)
- hardware_id(整数)
我将 '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();