2010-10-09 140 views
3

我有一個基本的數據表,它可以在此示例中是完全通用的,除了它包含Username列。將搜索添加到linq查詢中

我想要一個簡單的文本框和在Username字段上執行相似搜索的按鈕。我知道我可以使用.Contains()方法,它會在sql中轉換爲LIKE,但是這是做到這一點的正確方法嗎?

其次,假設我還有另一個項目,我還想搜索多對多關係,在這種情況下爲Label

Data 
{ 
    ID, 
    Name, 
    ... 
} 

Many 
{ 
    DataID, 
    OtherID 
} 

Other 
{ 
    ID, 
    Label 
} 

我最終想找到所有的數據項與一個標籤類似於一些搜索條款。我是否再次使用.Contains?

然後我想排序以在同一查詢中獲得用戶名和標籤的最佳匹配;如何將{用戶名和標籤}的組合形式排序?

編輯:LIKE查詢的結果如何排序?它只是基於索引,並且它匹配的二進制文件與它不匹配?我想我並不擔心每個人說的相似性得分,我或多或少地只是想知道這種機制。看起來它很容易返回LIKE查詢,但我一直認爲LIKE是一個糟糕的選擇,因爲它不使用數據庫中的索引。這是真的,如果是這樣嗎?

回答

1

字符串相似性不是SQL可以做得很好的東西。您最好的辦法是找到所有匹配的前兩個字符(或三個字符)(如果需要的話),然後假設這個數字是一個可管理的數字,使用Levenshtein距離或類似的方法計算客戶端的相似度得分(參見http://en.wikipedia.org/wiki/Levenshtein_distance)。

或者如果你感覺很勇敢,你可以嘗試這樣的事情! http://anastasiosyal.com/archive/2009/01/11/18.aspx

+0

第二個鏈接是激烈的。它非常酷,知道像史密斯水手這樣的東西可以在SQL中完成。我已經或多或少的意識到,我將要做的最好的結果是喜歡或不喜歡的二元結果,而且大多數情況下這很好。我主要是在詢問相似性搜索的難度;看來,在我的情況下,不值得麻煩。 – Shawn 2010-10-09 06:29:29

+0

客戶端可以在此處使用C#庫: - http://code.google.com/p/google-diff-match-patch/ – 2010-10-09 06:46:24

+0

+1 v。有用的鏈接。謝謝。 – 2010-10-09 08:10:25