2011-03-25 155 views
0

我一直在Google上搜索最近幾個小時,以找到解決我的問題,但即時通訊癱瘓。 我想知道是否有人可以幫我解決以下問題。C#Linq where子句.Contains(string [])

我有一個Linq查詢,查詢DataTable。我的String [] BodyTypes的PARAM保存字符串,如 「5,7,11」 或 「6,7,4」 或只是 「5,」

LINQ的我已經是:

var query2 = (from v in query.AsEnumerable() 
           where (from yy in BodyTypes  
             select yy).Contains(v.Header36.ToString()) 
           select new 
           { 
            PartNumber = v.PartNumber, 
            Position = v.Position, 
            ImagePath = v.ImagePath, 
            Supplier = v.Supplier, 
            Price = v.Price, 
            RRP = v.RRP, 
            Stock = v.Stock, 
            BaseCat = v.BaseCat, 
            Description = v.Description, 
            Header36 = v.Header36, 
            GT_Id = v.GT_Id 
           }); 

v.Header36有不同的值分配給它每行,即「11,7,4,5」或「11,6,7」

我的問題是我如何使用Linq匹配,我想匹配Header36與使用通配符或類似語句在字符串[] BodyTypes數組中傳遞的所有內容。 我的問題是這個DataTable從第三方的webservice加載,所以沒有SQL後端可以在這裏使用。 任何建議將非常感激。

親切的問候 尼爾。

回答

1

使它LINQ到對象實際上意味着它更容易回答。我想你想要的東西,如:

from v in query.AsEnumerable() 
let headers = v.Header36.Split(',') 
where yy.BodyTypes.Intersect(headers).Any() 
select new [...] 

請注意,您的(from yy in BodyTypes select yy)僅相當於BodyTypes(至少它會給出那麼你使用它的方式)大多 - 你不需要使用一個查詢表達式,每次你想做任何事情。

這裏有一個稍微更高效的版本:

HashSet<String> bodyTypes = new HashSet<String>(yy.BodyTypes); 
var query = from v in query.AsEnumerable() 
      let headers = v.Header36.Split(',') 
      where bodyTypes.Overlaps(headers) 
      select new [...] 
+0

謝謝你們驚人的快速反應。我試圖實現第一個代碼示例,但我在string.Split(「,」,v.Header36)上得到語法錯誤(紅色下劃線),我還應該補充說,這是在一個複合控件內完成的,如果這使得任何區別。 – 2011-03-25 15:05:02

+0

不要忘記調用.ToString()Header36 – GreyCloud 2011-03-25 15:07:59

+0

嗯這行錯誤 - 讓頭= string.Split(',',v.Header36.ToString())與 - 最好的重載方法匹配的string.Split(params char [])有一些無效參數 – 2011-03-25 15:18:16

0

嘗試使用正則表達式和。任何方法:

where (from yy in BodyTypes 
     select yy).Any(y => (new Regex(v.Header36.ToString())).IsMatch(y)) 
0

如果我理解這一點對你的身體的時間可能包含1,2,3,4和你Header36可能包含2,5,並且想要在兩個分隔字符串中出現某個項目時匹配?

更改您的where子句

where (from yy in BodyTypes select yy) 
    .Any(bts=> bts.Split(',').Any(bt=> v.Header36.Split(',').Contains(bt))) 
+0

這將被稱爲'分裂'非常多...這並不難,使它更簡單。 – 2011-03-25 14:43:01