需要一个查询来帮助我解决这个问题。
这是我的表格标签:
- id(int)
- name(字符串)
- user_id(int)
- hardware_id(int)
我正在按hardware_id对"tags"表的结果进行分组。我还有一个标签列表(List<string>
)。
我想获得自定义列表中所有标签在上表中的name
处匹配的组的硬件Id。
换句话说,我想得到自定义List标签与其name
匹配的hardware_id。可能有name
在自定义列表中不匹配,但所有自定义列表标记都必须在组中,如果它满足此需求,我可以获得该组的Id。
我发现很难解释,也没有得到答案。我想过用foreach来做,因为它很难解决,但我也做不到,而且这样做效率很低。
示例:
列表:['tag1','tag2']
表行:
1, tag1, 5, 1
2, tag2, 5, 1
3, tag3, 5, 1
4, tag4, 5, 2
5, tag5, 6, 2
在这种情况下,我应该得到hardware_id为1,因为尽管其中一个硬件id有tag3,但它没有任何行的标签名称不在列表中。如果List具有"tag4",则不会返回hardware_id=1,因为List具有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();
在该查询中,当我在List中有一个标记,并且在表中有几个hardware_id为1的项,其中一个项的"name"等于List中的值时,它将返回空结果。这是因为hardware_id的特定组的表中有一行的名称没有出现在自定义列表中。
我需要实体框架或Linq中的查询。非常感谢。
使用此:
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();
不能为您提供实体框架或linq查询,但sql解决方案是这样计算匹配:
SELECT hardware_id
FROM tags
WHERE name IN (<list>)
GROUP BY hardware_id
HAVING COUNT(DISTINCT name) = <listDistinctCount>
<listDistinctCount>
是列表中不同值的计数。您可以在查询之前准备。