我有这个函数从数据库中获取数据并且还有搜索。问题是,当我使用Entity框架进行搜索时速度很慢,但如果我使用相同的查询,我从日志中获取并在SSMS中使用它的速度很快。我还必须说有分配电影,388262。我也尝试在电影中添加标题索引,但没有帮助。
我在SSMS中使用的查询:
SELECT *
FROM Movie
WHERE title LIKE '%pirate%'
ORDER BY @@ROWCOUNT
OFFSET 0 ROWS FETCH NEXT 30 ROWS ONLY
实体代码(_movieRepository.GetAll()返回Queryable而不是所有电影):
public IActionResult Index(MovieIndexViewModel vm) {
IQueryable<Movie> query = _movieRepository.GetAll().AsNoTracking();
if (!string.IsNullOrWhiteSpace(vm.Search)) {
query = query.Where(m => m.title.ToLower().Contains(vm.Search.ToLower()));
}
vm.TotalItemCount = query.Count();
vm.Movies = query.Skip(_pageSize * (vm.Page - 1)).Take(_pageSize);
vm.PageSize = _pageSize;
return View(vm);
}
答案 0 :(得分:0)
警告:我对实体框架没有多少经验。
但是,您可能会在Entity Framework Performance Article from Simple talk.中找到有用的调试提示。查看您发布的内容可能会提高您的查询效果:
仅选择您感兴趣的特定列(听起来您只对查询“标题”列感兴趣)。
特别注意您的数据类型。您可能希望将NVARCHAR变量转换为VARCHAR(40)(或某些适当的字符限制)
答案 1 :(得分:0)
尝试删除所有ToLower()内容,
if (!string.IsNullOrWhiteSpace(vm.Search)) {
query = query.Where(m => m.title.Contains(vm.Search)));
}
sql server(与c#不同)默认情况下不区分大小写(尽管您可以将其配置为这种方式)。您的查询是强制SQL Server小写表中的每个记录,然后进行比较。