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

Sql 按查询分组,每个组不得有任何不在列表中的项,sql,entity-framework,linq,group-by,entity-framework-4,Sql,Entity Framework,Linq,Group By,Entity Framework 4,我需要一个能帮我解决这个问题的查询 这是我的桌子标签: id(int) 名称(字符串) 用户id(int) 硬件标识(int) 我正在按硬件id对“标记”表的结果进行分组。我还有一个标记列表(List) 我想获得自定义列表中所有标记在上表中aname处匹配的组的硬件Id 换句话说,我想获得硬件id,使自定义列表标记与它们的名称匹配。可能有name在自定义列表中没有匹配项,但所有自定义列表标记都必须在组中,如果它满足此需要,我可以输入该组的Id 我发现很难解释,我没有得到答案。我想用forea

我需要一个能帮我解决这个问题的查询

这是我的桌子标签:

  • id(int)
  • 名称(字符串)
  • 用户id(int)
  • 硬件标识(int)
我正在按硬件id对“标记”表的结果进行分组。我还有一个标记列表(
List

我想获得自定义列表中所有标记在上表中a
name
处匹配的组的硬件Id

换句话说,我想获得硬件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
在本例中,我应该得到硬件id 1,因为尽管其中一个硬件id有tag3,但它没有任何不在列表中的带有标记名的行。如果列表中有“tag4”,则不会返回hardware\u id=1,因为列表中有hardware\u 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 matchingHardareIds=db.tags.GroupBy(x=>x.hardware\u id)
其中(x=>x.All(s=>tags.Contains(s.name.ToLower())| | 0==tags.Count()&&(s.user_id==userId)))
.Select(x=>x.Key).ToList();
在该查询中,当我在列表和表中有一个标记时,我有几个硬件id为1的项目,其中一个项目的“名称”等于列表中的值,它将返回空结果。这是因为表中特定group by hardware_id的行有一个名称不在自定义列表中的行


我需要实体框架或Linq中的查询。非常感谢。

无法为您提供实体框架或linq查询,但sql解决方案是按如下方式计算匹配项:

SELECT hardware_id 
FROM tags
WHERE name IN (<list>)
GROUP BY hardware_id
HAVING COUNT(DISTINCT name) = <listDistinctCount>
选择硬件\u id
来自标签
其中名称位于()
按硬件\u id分组
有计数(不同的名称)=

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

无法为您提供实体框架或linq查询,但sql解决方案是按如下方式计算匹配项:

SELECT hardware_id 
FROM tags
WHERE name IN (<list>)
GROUP BY hardware_id
HAVING COUNT(DISTINCT name) = <listDistinctCount>
选择硬件\u id
来自标签
其中名称位于()
按硬件\u id分组
有计数(不同的名称)=
是列表中不同值的计数。您可以在查询之前准备这些信息。

使用以下方法:

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();
使用以下命令:

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();

同一个硬件ID不能有重复的名称,那么您就不需要首先读取那些不匹配的不同部分。剩下的行数必须与列表中的行数相同。我该怎么把它翻译成Linq。。英雄联盟我需要一点时间。是的,这就是解决办法。如何翻译为Linq-无法帮助您:)我看到您需要先创建组,然后使用
where(grp.Count=tags.Count())
您有这个问题,不是吗
s=>tags.Contains(s.name.ToLower())
同一个硬件ID不能有重复的名称,那么您就不需要先读取那些不匹配的不同部分。剩下的行数必须与列表中的行数相同。我该怎么把它翻译成Linq。。英雄联盟我需要一点时间。是的,这就是解决办法。如何翻译为Linq-无法帮助您:)我看到您需要先创建组,然后使用
where(grp.Count=tags.Count())
您有这个问题,不是吗
s=>tags.Contains(s.name.ToLower())
如果这样做有效,我将为您提供的示例提供我所有的stackoverflow点,我对其进行了测试,它成功了。如果这样做有效,我将为您提供的示例提供我所有的stackoverflow点,我对其进行了测试,它成功了。