2011-07-28 21 views
2

我有這樣的代碼:如何在LINQ上使用OR連接where子句?

foreach (Package pack in Packages) 
{ 
    filteredResults = filteredResults.Where(o => o.ID == pack.ID); 
} 

唯一的問題是,我過濾結果N個時間(因此N其中)。 我想要做的只是用N表達式篩選結果只有一次(只有一個where子句)。諸如此類:

Where o.ID == pack.ID OR o.ID == pack.ID OR o.ID == pack.ID OR o.ID == pack.ID... 

是否可以使用LINQ來做到這一點?

+0

有什麼'filteredResults'的類型? 'IQueryable '或'IEnumerable '?你正在使用哪個linq實現? Linq-To-Objects,... – CodesInChaos

+0

這是一回事。 – leppie

+1

你能澄清你想要的嗎?有些東西不能等於1和2(假設每個pack.ID都是不同的) – ChrisF

回答

3

像下面的代碼應該工作,或至少引導你在正確的方向。

-- Get all the package IDs you want to select on. 
var packIDs = from pack in Packages 
    select pack.ID; 

-- Return all results where the ID is in the package ids above. 
filteredResults = from result in filteredResults 
    where packIDs.Contains(result.ID) 
    select result; 

上面假設你和你的邏輯錯誤,你的意思是ors。

+0

謝謝!這實際上工作!我只是想知道是否可以連接在哪裏與OR :) – markzzz

2

像這樣的東西可以幫助你:

filteredResults = originalResults.Where(o => Packages.Any(p => p.ID == o.ID)); 
3
var packIds = Packages.Select(x=>x.ID).ToArray(); 
filteredResults = filteredResults.Where(o=> packIds.Contains(o.ID)); 

如果是這樣的LINQ to SQL這將讓翻譯成:

WHERE ID IN (1,2,3,4) 
1

你不想相交()?即

var ids = filteredResults.Select(fr => fr.Id).Intersect(Packages.Select(p => p.PackID)) ; 
1

我認爲你需要使用表達LinqKit

var v = from utente in db.Utente 
     select utente; 

Expression<Func<Utente, bool>> expr = c => c.Age == 26; 
expr = expr.Or<Utente>(c => c.Name != "Matteo"); 

v = v.Where(expr.Expand()); 

結果是:

SELECT...... FROM...... 
WHERE (26 = [Extent1].[Age ]) OR ('Matteo' <> [Extent1].[Name]) 

我有同樣的問題,我嘗試這種解決方案