2011-09-10 75 views
2

我有一個字符串數組,LINQ查詢:LINQ到由匹配的數量訂貨

/// <summary> 
/// Return all the search results 
/// </summary> 
public static GenericTagEntity[] getSearchResults(int SectionID, string[] Words) 
{ 
    GenericTagEntity[] Recs; 

    using (MainContext db = new MainContext()) 
    { 
     var q = (
      from c in db.tblArticles 
      join a in db.tblForumAuthors on c.AuthorID equals a.Author_ID 
      join u in db.tblProfiles on c.AuthorID equals u.UserID 
      where c.IsDeleted == false 
      && c.SectionID == SectionID 
      select new 
      { 
       c.Title, 
       c.ID, 
       c.Anchor, 
       c.Date, 
       c.Description, 
       u.EmailAddress, 
       u.UserID, 
       a.Username, 
       c.Body, 
       comments = (from f in db.tblComments where f.IsDeleted == false && f.Anchor == c.Anchor select new { f.ID }).Count() 
      }); 

我想要做的就是修改where,使返回結果,其中c.Titlec.Body包含一個或更多的話。然後我需要通過總匹配(最相關的第一個)排序!

這對我來說似乎非常困難,任何幫助都不勝感激。

我發現這個,但它只是部分有用的,也是SO搜索沒有產生許多結果。 http://msdn.microsoft.com/en-us/library/bb546166.aspx#Y200

+0

您使用的是LINQ提供程序? LINQ to SQL? – svick

+0

@Svick yes linq to sql –

回答

3

很傷心打破它給你,但你使用錯誤的工具來解決這個問題。可以在db中創建全文索引並通過自定義函數從LINQ調用全文搜索,也可以使用第三方全文搜索系統Lucene。

如果你真的想在sql中做,然後計數沒有。文檔中某個單詞的實例需要您更改您的數據庫模式。

您需要一個單詞表(id,word)和一個發生表(wordid,articleid),然後您可以在發生表上執行查詢以獲得您想要的結果。

+0

是的,僅在兩列上搜索並不太難或很慢,但要計算單詞 - 如果要編寫原始SQL,則可以這樣做(雖然性能比您的建議差得多),但我想不出在Linq-To-Sql中有什麼辦法。 (也就是說,沒有使用'.ToEnumerable',這會終止對合理性能的所有希望。) –

2

我相信這將這樣的伎倆

var occurrences = from e in q.Title.Split(new char[] { ' ' }).Concat(q.Body.Split(new char[] { ' ' })) 
      join word in Words on e equals word 
      group e by e into g 
      select new {element = g, count = g.Count()} into result 
      orderby result.count descending 
      select result; 

查詢將產生或者是在標題或正文下令出現次數下降單詞列表。

+0

卓越的工作與orderby計數 –