2014-02-10 87 views
0

這裏的陣列上是我的代碼:LINQ到SQL:使用部分匹配的字符串包含字符串

string[] customerNames = searchModel.CustomerName.Split(','); 
query = query.Where(d => customerNames.Contains(d.CustomerName, comparer) || customerNames.Contains(d.Company1.CompanyName, comparer)); 

,如果你只是尋找精確匹配其中一期工程。不過,我想部分匹配,即:如果customerNames包含一個元素'ell',它會選擇d如果d.CustomerName'Hello'因爲「ELL」是「你好」

我試圖重寫EqualityComparer,但我相信它是試圖在比較器中使用GetHashCode函數而不是Equals,我不知道該如何實現。

我應該怎麼辦?

+0

類似的問題:http://stackoverflow.com/questions/3748289/linq2sql-like-command-for-phrase – Rudis

+0

GetHashCode不能保證防止碰撞,所以你可以肯定還有更多的事情。 – Casey

回答

1
string[] customerNames = searchModel.CustomerName.Split(','); 
query = query.Where(d => customerNames.Any(c => c.Contains(d.CustomerName)) || customerNames.Any(c => c.Contains(d.Company1.CompanyName))); 

但是你應該知道,當customerNames有很多項目時,它可能會變得非常慢。

+0

我只是在回答這個問題。 8分鐘過後,我會檢查你。 customerNames應該是非常少的項目,但是我不確定我能做些什麼來避免這種邏輯。 – Dave

+0

它會翻譯成SQL或將在客戶端全套執行? –

+0

您可以使用['PredicateBuilder'](http://www.albahari.com/nutshell/predicatebuilder.aspx),並將'OR'條件列表添加到您的查詢中。這應該是更好,更快,然後'Any'+'Contains'鏈。 – MarcinJuraszek