如何使用linq2sql查询获得嵌套的IN子句?

本文关键字:IN 子句 嵌套 何使用 linq2sql 查询 | 更新日期: 2023-09-27 18:13:00

我试图在我们的应用程序中实现一些搜索功能,并有一个情况下,用户可以从列表中选择多个主题,我们要返回匹配至少一个选定主题的所有活动。每个活动可以有0到多个主题。

我可以写一个直接的SQL查询,给我想要的结果,像这样:

SELECT *
FROM dbo.ACTIVITY_VERSION av
WHERE ACTIVITY_VERSION_ID IN (
    SELECT ACTIVITY_VERSION_ID
    FROM dbo.ACTIVITY_TOPIC at
    WHERE at.TOPIC_ID IN (3,4)
)

我不明白的是如何写一个LINQ查询(我们使用LINQ to Sql),返回相同的结果。

我试过:

activities.Where(x => criteria.TopicIds.Intersect(x.TopicIds).Any());

如果活动是内存对象列表(即Linq到对象查询),这是有效的,但如果我尝试在查询中使用相同的代码,则会出现错误。我收到的错误是:

Local sequence cannot be used in LINQ to SQL implementations of query operators except the Contains operator.

我相信这意味着Linq to Sql不知道如何翻译Intersect或Any(或可能两者都有)。如果是这样的话,我明白为什么它不工作,但我仍然不知道如何使它做我想要的,我的Google-fu没有为我提供任何工作。

如何使用linq2sql查询获得嵌套的IN子句?

还没有测试过。但这就是你要做的。

List<int> IDs = new List<int>();
IDs.Add(3);
IDs.Add(4);
var ACTIVITY_VERSION_IDs = ACTIVITY_TOPIC
      .Where(AT => IDs.Contains(AT.TOPIC_ID))
      .Select(AT=>AT.ACTIVITY_VERSION_ID)
var results = ACTIVITY_VERSION
      .Where(AV => ACTIVITY_VERSION_IDs.Contains(AV.ACTIVITY_VERSION_ID))