2016-05-22 214 views
0

我有这个功能,它从数据库中获取数据并且还具有搜索功能。问题是,当我使用实体框架进行搜索时,速度很慢,但如果我使用与日志相同的查询并在SSMS中使用它,则速度很快。我还必须说有一些电影,388262.我也尝试在电影中添加一个标题索引,但没有帮助。快速查询不搜索,搜索速度慢,但在SSMS中快速搜索

查询我在SSMS使用:

SELECT * 
FROM Movie 
WHERE title LIKE '%pirate%' 
ORDER BY @@ROWCOUNT 
OFFSET 0 ROWS FETCH NEXT 30 ROWS ONLY 

实体代码(_movieRepository.GetAll()返回可查询不是所有电影):

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

添加.AsNoTracking()不会使它更快。 –

+0

当我删除'vm.TotalItemCount = query.Count();'它更快,但我需要找到的结果的计数,我怎么用LINQ来做到这一点? –

+0

在ssms中,如果您使用工具,您是否拥有分析器。如果是这样,你可以旋转一个跟踪并发布生成的SQL。同样,当你说缓慢有多慢你的意思。第二次是慢吗? –

回答

0

警告:我没有用太多的经验实体框架。

然而,你可能会发现在Entity Framework Performance Article from Simple talk.提供有用的调试技巧看着你已经发布你也许能改善你的查询性能:

  • 只选择你的具体列感兴趣(这听起来像你只是在查询'标题'栏目)。

  • 请特别注意您的数据类型。你可能会想你的NVARCHAR变量转换为VARCHAR(40)(或相应的字符限制)

0

尝试删除所有的ToLower将()的东西,

if (!string.IsNullOrWhiteSpace(vm.Search)) { 
     query = query.Where(m => m.title.Contains(vm.Search))); 
    } 

SQL服务器(不像C#)在默认情况下不区分大小写(尽管您可以将其配置为这种方式)。您的查询迫使sql服务器将表中的每条记录小写,然后进行比较。

+0

我试过这个,但它没有改变速度。 –