【问题标题】:Compare two arrays in LINQ query比较 LINQ 查询中的两个数组
【发布时间】:2019-05-23 03:01:34
【问题描述】:

我想编写 LINQ 查询来比较两个数组。我希望将查询转换为以下查询:

SELECT id, name 
FROM persons 
WHERE '{"dance", "acting", "games"}' && (hobbies);

该条件以这种方式起作用:

 '{"dance"}' && '{"dance", "acting", "games"}';  -- true
 '{"dance","singins"}' && '{"dance", "acting", "games"}';  -- true
 '{"singins"}' && '{"dance", "acting", "games"}';  -- false

我写了这个查询:

List<string> arr = new List<string>(){ "dance", "acting", "games" };
var query = (from p in _context.Persons
             where arr.Any(kw => p.hobbies.Contains(kw))
             select new
                  {
                      id = p.id,
                      name = p.name
                  }).ToList();

翻译后的查询是:

SELECT p."id" AS id, p."name" AS name 
FROM dataBase."Persons" AS p

它可以理解过滤器在服务器中执行。因此查询会从数据库中获取所有数据并在服务器上进行过滤。这会导致性能问题并且无法通过负载测试。

我需要一个查询,它不仅可以完成这项工作,而且还可以使用“&&”转换为上述查询。

在 LINQ 中有什么方法可以执行这个查询吗?

谢谢

【问题讨论】:

  • 您使用的是Entity Framework 的某个版本吗?如果是这样,您是否愿意接受使用您编写的 SQL 查询的答案?

标签: postgresql linq


【解决方案1】:

如果您的数据库看起来像我预测的那样,这可能是一个解决方案。虽然还有一些代码,但我认为这应该作为 SQL IN 语句执行:

List<string> arr = new List<string>(){ "dance", "acting", "games" };

var matches = from hobby_person in _context.Hobbies_Persons
join person in _context.Persons on person.Id equals hobby_person.PersonId
join hobby in _context.Hobbies on hobby.Id equals hobby_person.HobbyId
where arr.Contains(hobby.Name) 
         select new
              {
                  id = p.id,
                  name = p.name
              }).ToList();

【讨论】:

  • 我现在看到你正在使用 postgresql,很抱歉,这是为 sql server 准备的
  • 应该是类似的东西:postgresqltutorial.com/postgresql-in
  • 我知道我可以通过创建一个新表来解决这个问题,但这不是我正在寻找的解决方案。因为我已经在 Postgres 中找到了解决方案。我只需要知道LINQ中是否有翻译
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 2015-08-30
相关资源
最近更新 更多