对于我正在做的网站,我们正在使用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
匹配。
答案 0 :(得分: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
答案 1 :(得分:3)
看起来Linq to Entities不支持包含:
http://msdn.microsoft.com/en-us/library/bb738638.aspx
我会为这个推出自己的查询。如果您发现这些类型的搜索会导致性能问题,那么您可能希望完全控制文本搜索查询。
答案 2 :(得分: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();
答案 3 :(得分:0)
与LINQ无关,但您可以考虑使用SQL Server Full-Text Search,而CONTAINS谓词理解布尔运算符-AND,OR和AND NOT。