0

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

4

1 回答 1

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))
于 2013-05-10T21:28:20.740 回答