7

对于我正在做的网站,我们正在使用 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));
    }

这目前按预期工作,但我认为这不是解决问题的最佳方法。我错过了一些明显的东西吗?

注意:这是AND匹配的。

4

4 回答 4

10

我发现这对我有用 - 这是使用 VB.Net 和 Entity Framework 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

而这个做“AND”风格的查询:

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
于 2010-07-08T09:14:14.643 回答
3

看起来 Linq to Entities 不支持包含:

http://msdn.microsoft.com/en-us/library/bb738638.aspx

我会为此提出自己的查询。如果您发现这些类型的搜索成为性能问题,您可能希望完全控制文本搜索查询。

于 2009-02-18T05:09:35.553 回答
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();
于 2009-02-20T22:19:20.947 回答
0

与 LINQ 无关,但您可以考虑使用 SQL Server全文搜索,而CONTAINS谓词理解布尔运算符 — AND、OR 和 AND NOT。

这篇文章也很有用:动态组合表达式谓词

于 2009-02-18T05:19:10.710 回答