【问题标题】:Full match against a List of strings per id与每个 id 的字符串列表完全匹配
【发布时间】:2016-11-24 10:49:53
【问题描述】:

我需要一个 Linq 查询,如果不是所有行都有来自每个 hardware_id 列的 List<string> 中的匹配字符串,则该查询将返回 null。

我有下表:

  • id (int) - 主键
  • 名称(字符串)
  • user_id (int)
  • hardware_id (int)

我有一个包含短语的List<string>。如果列表中的所有短语在名称行中都有匹配的字符串,我希望查询返回 hardare_id 编号。如果其中一个短语没有name 匹配,则返回 null 并且如果所有短语的每个 hardware_id 都存在所有短语,则查询应返回这些 hardware_id 中的每一个都具有完整的 hardware_id 列表匹配列表中的所有短语。

或者换句话说,返回一个 hardware_id 的列表,每个 id 的所有 name 都与 List<string> 中的匹配。

我曾考虑在不同的查询中迭代每个 Id,但这不是一种有效的方法。也许你知道一个很好的查询来解决这个问题。 我正在使用实体框架 6/C#/MySQL

注意:查询仅针对每个用户 ID 进行。所以我先通过User Id过滤表,然后需要找到满足条件的匹配hardare_id。

【问题讨论】:

    标签: c# sql entity-framework linq entity-framework-6


    【解决方案1】:

    在hardware_id 上分组,然后查找List 中存在的所有短语

    table.GroupBy(x=>x.hardware_id)
         .Where(x=> x.All(s=> phrases.Contains(s.name))
         .Select(x=>x.Key); 
    

    【讨论】:

    • 我现在就试试,我已经很接近了,我从 hardware_id 上的 group by 开始,我想用 for each 对其进行迭代,但你的看起来像是一个巧妙的仅查询解决方案。跨度>
    • 在哪里添加 user_id 过滤?我需要在 Where 部分添加另一个过滤器。
    • 我建议将它放在Where 条件本身中。
    • 是的,但是如何在 WHERE 中添加第二个条件。我应该在第一个之前添加另一个 .WHERE 吗?我需要在运行查询之前过滤数据,因此它只会针对特定的 user_id 运行。它不允许我链接两个 WHERE 条件。
    • 我的代码有问题。当我在hardware_id 列表中有一个要搜索的标签并且有一行与hardware_id 匹配时,它不会返回任何结果。如果有一个匹配,我仍然想返回匹配结果,只是有一个标签一起没有匹配,不返回任何结果。换句话说,如果有一个标签与特定的 hardware_id 不匹配,则不返回任何结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 2021-11-22
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    相关资源
    最近更新 更多