2009-02-18 80 views
7

對於我在做的網站,我們使用的是LINQ to Entities。我一直在向網站添加搜索功能。我試圖找出最優雅的方式來搜索數據庫中單個字段上的多個關鍵字(用戶輸入)。請允許我舉個例子。LINQ to Entities搜索多個關鍵字的文本屬性

表列:

Name, Description 

實例行:

"Cookie monster", "Fluffy, likes cookies and blue" 

用戶搜索(分隔符無所謂):

"blue fluffy" 

目前我使用如下:

public List<SesameCharacters> SearchByKeywords(string keywords) 
    { 
     List<SesameCharacters> output = new List<SesameCharacters>(); 
     string[] k = keywords.ToLower().Split(' '); 
     using (SesameStreet_Entities entities = new SesameStreet_Entities()) 
     { 
      IQueryable<SesameCharacters> filter = entities.SesameCharacters; 

      foreach (string keyword in k) 
       filter = ForceFilter(filter, keyword); 

      output = filter.ToList(); 
     } 
     return output; 
    } 

    private IQueryable<SesameCharacters> ForceFilter(IQueryable<SesameCharacters> filter, string keyword) 
    { 
     return filter.Where(p => p.Description.ToLower().Contains(keyword)); 
    } 

這目前正如預期的那樣工作,但我想這不是解決問題的最佳方案。我是否缺少明顯的東西?

NOTE:這是AND的匹配。

+0

古怪,答案在這裏,我投它,然後因爲我認爲這是錯誤的,然後去投票支持,因爲它是正確的,現在它已經消失了。 – jfar 2009-02-18 05:07:19

+1

是的,有一個來自casperOne的答案,但是有人必須有它的答案。他建議使用一個存儲過程,這正是我們現在正在傾向的過程。 – 2009-02-18 20:18:01

+0

我處於相同的情況......您是否找到LinqToEntities的解決方案,或者最終使用存儲過程? – Kjensen 2009-06-13 16:46:35

回答

1

約來代替:

IQueryable<SesameCharacters> filter = entities.SesameCharacters; 

     foreach (string keyword in k) 
      filter = ForceFilter(filter, keyword); 

     output = filter.ToList(); 

務必:

return (from c in entities.SesameCharacters 
     where k.Contains(c..Description.ToLower()) 
     select c 
     ).ToList(); 
10

我發現這個工作對我來說 - 這是使用VB.Net與實體框架4.0,但我敢肯定的原則翻譯。

這人做了「OR」的風格查詢:

Function Search(ByVal query As String) As IQueryable(Of Product) 
    Dim queryWords As String() = query.Split() 
    Dim entities As New Entities() 

    Return entities.Products.Where(Function(p) queryWords.Any(Function(w) p.Description.Contains(w))) 
End Function 

而這其中確實「和」樣式的查詢:

Function Search(ByVal query As String) As IQueryable(Of product) 
    Dim queryWords As String() = query.Split() 
    Dim entities As New Entities() 

    Return entities.Products.Where(Function(p) queryWords.All(Function(w) p.Description.Contains(w))) 
End Function