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

问题描述:

我想在我们的应用程序中实现一些搜索功能,并且有一种情况,用户可以从列表中选择多个主题,并且我们希望返回至少与所选主题中的一个匹配的所有活动。每个活动可以有0到多个主题。如何使用linq2sql查询获取嵌套的IN子句?

我可以写一个直接的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到SQL不知道怎么翻译要么相交或任何(或可能两者都有)。如果是这样的话,我明白为什么它不能正常工作,但我仍然不知道如何使它达到我想要的效果,而我的Google-fu没有向我提供任何有用的东西。

+0

这不是它抱怨的“任何”。它抱怨'Intersect'。当涉及本地序列时,只能在您的lambda中使用“Contains”。 (这就是错误信息所说的)。 – 2013-05-10 21:28:53

还没有测试过。但这是你将如何去做的。

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