在没有搜索的情况下快速查询,在搜索时速度慢,但在SSMS中快速搜索

时间:2016-05-22 21:30:07

标签: asp.net-core entity-framework-core azure-sql-database

我有这个函数从数据库中获取数据并且还有搜索。问题是,当我使用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);
}

2 个答案:

答案 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小写表中的每个记录,然后进行比较。