繁体   English   中英

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

[英]How can I get a nested IN clause with a linq2sql query?

我正在尝试在我们的应用程序中实现一些搜索功能,并且遇到这样的情况:用户可以从列表中选择多个主题,而我们希望返回与至少一个所选主题匹配的所有活动。 每个活动可以有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并没有为我提供任何可行的方法。

尚未测试。 但是,这就是您要做的事情。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM