2017-06-06 62 views
0

我有一個集合,根據我使用的標準進行篩選,包含下面給出的子句。 我正在進一步創建一個基於過濾記錄並返回相同的新集合。LINQ包含子句 - 標準中多於一個值

問題

如果我有更多然後在「multipleCodes」一個值,這是在使用含有條款..這是行不通的。 如果我只放1個值...它確實有效。

任何想法我錯過了什麼?或者是否有更好的方法來篩選記錄並僅重新篩選結果集?

collectionToFilter.Where(d => (d.Code.**Contains**(multipleCodes)) && 
       d.NeededDate > minNeedDate && d.NeededDate < maxNeedDate) 
        .ToList() 
        .ForEach(d => filteredCollection.Add(d)); 
+0

是'Code'屬性的一個字符串嗎?並且是'multipleCodes'變量的一個字符串集合? –

+1

@RobertPetz - multipleCodes是可變的,有多個值用逗號分隔。低於詹姆斯的迴應爲我工作。 – Amit

回答

1

從您的評論我想告訴你一個更清潔,更可讀的答案。

var _multipleCodes = multipleCodes.Split(','); 
collectionToFilter.Where(d => _multipleCodes.Contains(d.Code)); 
+0

@Amit我感覺你有一個SQL背景,並且想複製'WHERE d.Code IN(... values ... )' - 我一直都會這樣做,以免發生意外。只是顛倒Linq的邏輯(如上)通常在大多數情況下解決它。 –

+1

是的,我確實有SQL背景,在測試過程中,我發現第一種方法沒有100%的工作,我試着用你的方法執行,我得到了與SQL查詢中完全一樣的計數。 – Amit

+0

也這麼認爲。如果您考慮使用的關鍵字 - 在SQL中,一個值是** IN **是一組可能性。在Linq中,如果**包含**單個值,則正在測試一系列可能性。所以它基本上是從相反方向進行查詢 –

2
collectionToFilter.Where(d => (multipleCodes.Any(mc=>d.Code.Contains(mc))) && 
+0

作爲一個說明 - 從這個問題不清楚,「代碼」是一個字符串,而不是一個集合。這大大改變了這個答案的有效性。如果'Code'是一個集合,這個工作運行良好,但是因爲它是一個字符串類型'Contains'是一個完全不同的方法,它將測試該字符串中* mc *的值是否存在*,而不是該字符串*等於*'mc'。根據這些值,可能會返回'BC'存在於'ABCD'中,即使它們是不同的代碼。 –

+1

啊哈...它是一個單獨的逗號分隔的字符串,從來沒有發生過我.. –