如何使用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没有向我提供任何有用的东西。
答
还没有测试过。但这是你将如何去做的。
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))
这不是它抱怨的“任何”。它抱怨'Intersect'。当涉及本地序列时,只能在您的lambda中使用“Contains”。 (这就是错误信息所说的)。 – 2013-05-10 21:28:53