【问题标题】:Find matching tag items in table from string array using linq使用linq从字符串数组中查找表中匹配的标签项
【发布时间】:2013-07-09 20:37:10
【问题描述】:

我有一个SQL 这样的标签表:

Id   |  Tag
-----------------
1    |  car
1    |  red
1    |  sport
2    |  car
2    |  red
2    |  SUV

我只想检索完全匹配的搜索字符串的 ID。所以,使用 LINQ,我想查询: “汽车,红色”

并让它返回:1 和 2。

然后搜索"car,red,sport" 将只返回 1。

我完全不确定如何使用 LINQ 来做到这一点。如果我执行以下操作(以 EF 上下文和表格为例):

string[] tags = {"car","red","sport"}
var query = context.CarTags.Where(a => tags.Contains(a.Tag)).Select(s=>s);

...当然会同时返回 1 和 2。

那么,我如何使用 LINQ 做到这一点?

【问题讨论】:

  • 如果你要搜索sportSUV呢?

标签: sql arrays linq entity-framework entity


【解决方案1】:
string[] tags = {"car","red","sport"}

var query = context.CarTags
                   .GroupBy(a => a.Id)
                   .Where(g => tags.All(t => g.Any(a => a.Tag == t)))
                   .Select(g => g.Key);

我不确定它是否适用于 LINQ to Entites,但肯定会尝试一下。

所有使用的方法都在Supported and Unsupported LINQ Methods (LINQ to Entities) 列表中列为supported,所以应该可以工作。但即使是这样,我也可能会检查生成的 SQL 以确保它不会过于复杂且不是很有效。

【讨论】:

  • 它有点用......但如果我通过 {"car","re​​d"} 查询它就不起作用。它不返回任何结果。
  • 啊,Where 声明错误。现在检查。我已经更新了我的答案。
  • @user2566049 只是出于好奇。您能否将 LINQ 为该查询生成的 SQL 发布到实体? :)
  • 好吧,我很乐意,但它“太长了 1096 个字符”!如果你愿意,我可以给你发电子邮件
  • 那就太好了。您应该可以在我的个人资料、SO 或我的网站上看到我的电子邮件(也可以在个人资料中链接)。谢谢!
猜你喜欢
  • 2020-08-07
  • 1970-01-01
  • 1970-01-01
  • 2018-04-12
  • 2017-11-14
  • 2013-03-21
  • 1970-01-01
  • 2014-06-26
  • 1970-01-01
相关资源
最近更新 更多