2015-05-26 37 views
2

我試圖LINQ查詢中的字符串數組上使用Array.Contains:不區分大小寫Array.Contains在LINQ查詢

var otherMatchingDevices = from d in selectedDevices 
          from c in mldb.Companies 
          where d.CompanyID == c.CompanyID && c.Deleted == 0 
          where searchTerms.Contains(d.Name.ToString(), StringComparer.CurrentCultureIgnoreCase) || searchTerms.Contains(c.CompanyName.ToString(), StringComparer.CurrentCultureIgnoreCase) 
          select d; 

當查詢評估其與「用於查詢不支持過​​載崩潰運營商「包含」

我測試使用StringComparer此代碼,它工作正常,並打印出「富」:

string[] sList = { "fOO", "bar" }; 
string[] array = { "foo" }; 
List<string> stringlist = sList.ToList(); 
var qry = from s in stringlist 
      where array.Contains(s, StringComparer.CurrentCultureIgnoreCase) 
      select s; 
if (qry.Count() > 0) Console.WriteLine(qry.First().ToString()); 

誰能告訴我如何使用不區分大小寫的陣列。包含在Linq查詢中?我不想轉換原始字符串ToUpper()或ToLower(),因爲它很昂貴,它會更改原始數據。

+2

您是否使用LINQ2SQL或LINQ2Entities?如果是這樣,那就是爲什麼它不被支持。 –

+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

+0

@MichaelDunlap使用Linq to SQL類。 –

回答

4

使用Linq to SQL調用您的第一個代碼段,這意味着它最終將被轉換爲SQL。所以,比較是否區分大小寫取決於表列的COLLATION。這就是Linq拋出異常的原因,因爲它不能保證區分大小寫。使用LINQ到對象進行

你的第二查詢片段中,因此字符串相等可以執行的,因爲實際string已經在存儲器中。

+0

謝謝,這說明了爲什麼Contains方法不能用於Linq to SQL類,也沒有發生表格的排序問題。謝謝@ haim770 –

2

我測試使用StringComparer此代碼,它工作正常, 打印出「富」:

LINQ到對象比LINQ到不同的SQL /實體。後者需要將您的查詢轉換爲SQL表達式,因此它不瞭解StringComparsion是什麼。

您可以使用AsEnumerable()您的查詢帶來的數據在內存中:

var otherMatchingDevices = (from d in selectedDevices 
          from c in mldb.Companies 
          where d.CompanyID == c.CompanyID && c.Deleted == 0) 
          .AsEnumerable() 
          .Where(searchTerms.Contains(d.Name.ToString(), 
               StringComparer.CurrentCultureIgnoreCase) || 
            searchTerms.Contains(c.CompanyName.ToString(), 
               StringComparer.CurrentCultureIgnoreCase)) 
          .ToArray() 
+0

如果有人打算在內存中進行過濾(因爲它可能會很慢,所以大量的警告),我建議把'searchTerms'放到一個非情況敏感的哈希集合中。 'HashSet (StringComparer.OrdinalIgnoreCase)' – Magnus

+0

這裏的代碼不起作用,但答案很有用,我得到了基本想法,現在我看到了問題。謝謝@Magnus –

+0

@ IanK.CO什麼不行? –