2012-10-12 9 views
4

所有值我有了逗號分隔的ID列,我進入在LINQ列表這一點。選擇當存在於表<int>

我需要做的僅僅是返回的數據行,其中該列表中的所有值都存在於另一個,我找到了工作,如果存在的話,但我需要的所有。下面

代碼:

results = 
results.Where(
    d => d["FilterIDs"] != null && // Check the row has FilterIds 
    !filterValues.Except(
     d["FilterIDs"].ToString().Split(',').ToList(). // Tokenise the string 
     Where(s => !String.IsNullOrEmpty(s)).ToList(). // Filter out bad tokens 
     ConvertAll<int>(s => Convert.ToInt32(s)) // Convert all the tokens to ints 
     ).Any()); 
      } 

因此,舉例來說,我有一個具有1,2,3,4,在它的列 'FilterIDs'

然後我有1,2個排,在我的列表'filterValues'3,4,5,6,7 - 在這種情況下,這一行將被返回。

另一行有1,8,9 - 只有1場比賽因此這將不予退還。

我一直轉圈圈也失去了將與此所以任何幫助是極大的讚賞。

回答

0

我會用Enumerable<T>.All()

results = results.Where(d => d["FilterIDs" != null && 
    d["FilterIDs"].ToString() 
     .Split(',', StringSplitOptions.RemoveEmptyEntries) 
     .Select(Int32.Parse) 
     .All(f => filterValues.Contains(f))); 
+0

當別人不幸的是,我得到行回那些在出於某種原因 – dhardy

0

這個怎麼樣?

results = 
results.Where(
    d => !d.IsNull("FilterIDs") && // Check the row has FilterIds 
     d["FilterIDs"] 
      .ToString() 
      .Split(',') // Tokenise the string 
      .Where(s=>!String.IsNullOrEmpty(s)) 
      .ConvertAll<int>(s => Convert.ToInt32(s)) 
      .All(i => filterValues.Contains(i)) 
    ); 
+0

這似乎給了相同的結果filterIDs列NULL,我越來越排之後有在filterIDs列NULL出於某種原因 – dhardy

+0

什麼是results'和/或'D'的'類型?你是否得到'null'或'DBNull'? –

+0

'd [「FilterIDs」]'不能爲null,否則內部查詢會拋出'NullReferenceException'。 –

2

看來你剛纔扭轉你的Except電話 - 你已經使用A.Except(B)當你的意思是B.Except(A)

這就是說,這裏是我會怎麼寫:

var query = from row in results 
      let filterIds = row["FilterIDs"] 
      where filterIds != null 
      let numbers = filterIds.ToString() 
            .Split(',') 
            .Where(s => !string.IsNullOrEmpty(s)) 
            .Select(int.Parse) 
      where !numbers.Except(filterValues).Any()   
      select row;    
+0

感謝阿尼,但它似乎仍然返回在FilterIDs柱NULL這些行,會努力的!= DbNull.Value ... – dhardy

+0

沒有運氣,它似乎仍然不是空與在FIlterIDs NULL返回那些:( – dhardy