2012-01-27 35 views
2

我正在使用LINQ to Entities,我試圖做一個簡單的OR查詢。我有一個名爲「鏈接」的表格,當我運行一個查詢時,我想包含所有包含標籤列表中的任何標籤以及與搜索詞匹配的所有鏈接的鏈接。例如:如何用LINQ做簡單的OR查詢?

var tags = new List<string> 
{ 
    "games", 
    "events", 
    "recipes" 
}; 

var searchTerms = new List<string> 
{ 
    "hockey", 
    "barbecue", 
    "cheesecake", 
    "basketball" 
} 

var links = _entityContainer.Links 
    .Where(x => x.Tags.Any(y => tags.Contains(y.Name)) 
    .Where(x => searchTerms.Any(y => x.Title.Contains(y))); 

注:一個鏈接實體呼叫Tags所以在第一.Where()我檢查每個鏈接的集合中的標籤導航屬性,看看標籤的列表我在尋找包含其中之一。

在第二個.Where()我只是檢查鏈接的Title屬性是否包含任何搜索項。

我的問題是,此代碼包含所有包含列表中至少一個標記且與搜索項匹配的所有鏈接。但我想將兩者結合在一起。我希望我的鏈接列表中包含與列表中的1個或多個標籤相匹配的所有鏈接,或者與列表中的1個或多個搜索詞匹配。

我也有一個問題,因爲tags.Contains()searchTerms.Any(),因爲這些調用是無法轉換成表達式傳遞給EF。他們會工作,如果我做了ToList()但我不能這樣做,因爲它會將大量記錄拉入內存。

對完成我的目標有何建議?任何幫助深表感謝。

+0

不要使用'ToList()',而是使用'AsEnumerable()'代替,這應該大大減少了內存佔用,同時還讓你做你的查詢。 – 2012-01-27 06:18:12

回答

7

濃縮成一個WHERE子句:

var links = _entityContainer.Links 
    .Where(x => 
     x.Tags.Any(y => tags.Contains(y.Name)) || 
     searchTerms.Any(y => x.Title.Contains(y))); 
+0

這樣比較好,但我仍然對調用'tags.Contains()'和'searchTerms.Any()'有問題。 – Chev 2012-01-27 06:20:29

+0

我得到了這個工作。謝謝。 – Chev 2012-01-27 06:32:51