2013-05-10 76 views
0

我想在我們的應用程序中實現一些搜索功能,並且有一種情況,用戶可以從列表中選擇多個主題,並且我們希望返回至少與所選主題中的一個匹配的所有活動。每個活動可以有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

回答

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