2014-11-24 80 views
3

我有一個mvc項目,我在其中使用linq。 我的數據庫中有一些記錄,例如 「Someth荷蘭國際集團」, 「SOmeTH荷蘭國際集團」, 「someTh荷蘭國際集團」, 「SOMETH ING」, 「someTH ING」不區分大小寫「包含」Linq

我想這樣做:

SELECT * FROM dbo.doc_dt_records WHERE name LIKE '%' + @records.Name + '%' 

但是,如果我運行此代碼,list.Count返回0.我該怎麼辦?

records.Name = "someth ing"; //for example 
    var rec = db.Records.ToList(); 
     var lists = rec.Where(p => p.Name.Contains(records.Name)).ToList(); 
if (lists.Count > 0) 
{ 
    // do sthng 
} 

感謝您的幫助...

+0

重新開業,因爲在LINQ點複製到內存中的解決方案忽略了核心問題 - 這是這是在錯誤的排序規則一個SQL「的問題」 。 – TomTom 2014-11-24 14:35:53

+0

contains函數有一個第二重載,您可以在其中設置IEqualityComparer,對於字符串和對其進行忽略它是:items.Contains(「teszt」,StringComparer.CurrentCultureIgnoreCase) – 2014-11-24 14:36:35

回答

9

簡單的方法就是與tolower()方法

var lists = rec.Where(p => p.Name.ToLower().Contains(records.Name.ToLower())).ToList(); 

一個更好的解決方案(基於這個帖子:Case insensitive 'Contains(string)')使用

var lists = rec.Where(p => 
      CultureInfo.CurrentCulture.CompareInfo.IndexOf 
      (p.Name, records.Name, CompareOptions.IgnoreCase) >= 0).ToList(); 
+2

LINQ to Entities不能識別方法'Int32 IndexOf System.String,System.String,System.Globalization.CompareOptions)'方法,並且此方法不能轉換爲商店表達式。 – nVentimiglia 2016-08-28 19:19:37

2

使用IndexOfStringComparison.OrdinalIgnoreCase

p.Name.IndexOf(records.Name, StringComparison.OrdinalIgnoreCase) >= 0; 

你可以這樣創建一個擴展功能:

public static bool Contains(this string src, string toCheck, StringComparison comp) 
{ 
    return src.IndexOf(toCheck, comp) >= 0; 
} 
-2

可他們兩個的比較結果爲小寫。

SELECT * FROM dbo.doc_dt_records WHERE LOWER (name ) 
LIKE '%' + @records.Name.ToLower() + '%' 
3

這完全不是LINQ問題。

對生成的SQL的大小寫敏感取決於表格的相關排序規則。在你的情況下可能是不區分大小寫的。

您將從您發出的任何SQL中獲得相同的結果。

0

試試這個

var lists = rec.Where(p => String.Equals(p.Name,records.Name,StringComparison.OrdinalIgnoreCase)).ToList(); 

參考here爲文檔