2009-02-18 74 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