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

时间:2013-05-10 21:13:24

标签: c# linq-to-sql

我正在尝试在我们的应用程序中实现一些搜索功能,并且用户可以从列表中选择多个主题并且我们希望返回与至少一个所选主题匹配的所有活动。每个活动可以有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 to Objects查询),则此方法有效,但如果我尝试在命中数据库的查询中使用相同的代码,则会出错。我收到的错误是:

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

我认为这意味着Linq to Sql不知道如何翻译Intersect或Any(或可能两者)。如果是这样的话,我理解为什么它不起作用,但我仍然不知道如何让它按照我的意愿行事,而且我的Google-fu没有向我提供任何有用的东西。

1 个答案:

答案 0 :(得分:1)

尚未测试过。但这就是你要做的事情。

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