我发现很多教程和书籍在 MVC web 应用程序中实现自动完成搜索,如下所示:-
public ActionResult ArtistSearch(string q)
{
var artists = GetArtists(q);
return PartialView(artists);
}
private List<Artist> GetArtists(string searchString)
{
return storeDB.Artists
.Where(a => a.Name.Contains(searchString))
.ToList();
}
但这提出了一个问题,即这种方法在可能有数千条记录的实际应用程序中的可扩展性有多大???,那么使用 Contains() 是否可以很好地扩展? BR
请您参考如下方法:
如果我没记错的话,string.Contains() 被翻译成一个 LIKE 查询,在查询字符串的每一边都有一个通配符。这使得使用索引变得非常困难/不可能,因此您可以期望在数据集上的性能为 O(n),因为 SQL Server 执行全表扫描(请参阅 Does SQL Server optimize LIKE ('%%') query?)。
要优化您的查询,您可能需要查看全文索引功能,更多信息请参见:SQL Server: how to optimize "like" queries? ).
如果你可以使用 .StartsWith 而不是 .Contains 你将有一个末尾带有通配符的 LIKE 查询,你可以在查询列上使用索引来快速查找(确保检查查询执行计划!)。
我想如果您尝试专注于自动完成功能的用户体验,您将获得更好的感知性能:在短暂的锁定期后(当用户停止输入时)开始自动完成搜索,并确保它不会't 阻塞(发生在后台)。
