2009-08-24 44 views
4

這是我現在有一個非常基本的搜索:LINQ關鍵字搜索與排序依據基於計數(LINQ到SQL)相關

var Results = from p in dx.Listings select p; 
if (CategoryId > 0) Results = Results.Where(p => p.CategoryId == CategoryId); 
if (SuburbId > 0) Results = Results.Where(p => p.SuburbId == SuburbId); 
var OrderedResults = Results.OrderByDescending(p => p.ListingType); 
OrderedResults = OrderedResults.ThenByDescending(p => p.Created); 

我知道我可以在。載有(添加)或類似並從關鍵字框中輸入關鍵字(拆分爲單個項目),並獲得結果列表。

但是我需要通過基本相關性來排序結果。這意味着如果記錄A包含2個關鍵字(在'Body'nvarchar(MAX)字段中),它應該高於僅匹配1個關鍵字的記錄B.我不需要對每一次擊球進行全面統計......但是,如果這是一個eaiser來管理的話就沒問題。

那麼有沒有什麼辦法直接在命令中直接得到命中數呢?我可以通過獲取結果和解析來管理它,但是我真的不想這麼做,因爲解析可能有數千個人可能突破IIS機器,而SQL Server是一個體面強大的集羣:)

如果任何人有任何想法或提示這將是一個很大的幫助。

回答

2

如果我正確理解你,你想打電話OrderyByDescending(p => p.Body),但它應該按p.Body中某個單詞appreas的次數來排序?

那麼你應該能夠創建一個計算的出現,並返回計數,那麼你可以簡單地做OrderyByDescending(p => CountOccurences(p.Body))

您也可以創建一個BodyComparer類,它實現的IComparer,然後將它傳遞的方法到OrderByDescending

編輯: 採取一看這個鏈接Enable Full Text Searching

+0

如果我創建一個自定義功能在裏面添加,然後它會在Web服務器上本地解析每條記錄而不是一個SQL查詢是否正確? – 2009-08-24 14:37:34

+0

沒錯。你正試圖通過LINQ OrderBy方法來實現這一點,我現在瞭解你嗎? – 2009-08-24 14:40:06

+0

是啊:)我到目前爲止所能想到的可能是一組動態子查詢每個關鍵字來獲得計數orderby ...這似乎凌亂嘿 – 2009-08-24 14:42:37

0

下面是一個簡單的例子,如果我知道你在找什麼正確:

var storedData = new[]{ 
    new int[] {1, 2, 3, 4}, 
    new int[] {1, 2, 3, 4, 5} 
}; 
var itemsFromTextBox = new[] { 3, 4, 5 }; 

var query = storedData.Where(a => a.ContainsAny(itemsFromTextBox)) 
    .OrderByDescending(a => itemsFromTextBox.Sum(i => a.Contains(i)? 1:0)); 

用下面ContainsAny擴展:

public static bool ContainsAny<T>(this IEnumerable<T> e1, IEnumerable<T> e2) 
{ 
    foreach (var item in e2) 
    { 
     if (e1.Contains(item)) return true; 
    } 
    return false; 
}