实体框架 - 添加group by后查询速度慢

时间:2017-09-14 06:06:59

标签: c# asp.net .net entity-framework entity-framework-6

我有一个非常快速运行的以下查询:

var query =
    (from art in ctx.Articles

     join phot in ctx.ArticlePhotos on art.Id equals phot.ArticleId
     join artCat in ctx.ArticleCategories on art.Id equals artCat.ArticleId
     join cat in ctx.Categories on artCat.CategoryId equals cat.Id
     where art.Active && art.ArticleCategories.Any(c => c.Category.MaterializedPath.StartsWith(categoryPath))
     orderby art.PublishDate descending
     select new ArticleSmallResponse
     {
         Id = art.Id,
         Title = art.Title,
         Active = art.Active,
         PublishDate = art.PublishDate ?? art.CreateDate,
         MainImage = phot.RelativePath,
         RootCategory = art.Category.Name,
         Summary = art.Summary
     })
     .AsNoTracking().Take(request.Take);

但是,如果我添加group by并将查询更改为以下语句,则运行速度要慢得多。

var query =
    (from art in ctx.Articles

     join phot in ctx.ArticlePhotos on art.Id equals phot.ArticleId
     join artCat in ctx.ArticleCategories on art.Id equals artCat.ArticleId
     join cat in ctx.Categories on artCat.CategoryId equals cat.Id
     where art.Active && art.ArticleCategories.Any(c => c.Category.MaterializedPath.StartsWith(categoryPath))
     orderby art.PublishDate descending
     select new ArticleSmallResponse
     {
         Id = art.Id,
         Title = art.Title,
         Active = art.Active,
         PublishDate = art.PublishDate ?? art.CreateDate,
         MainImage = phot.RelativePath,
         RootCategory = art.Category.Name,
         Summary = art.Summary
     })
     .GroupBy(m => m.Id)
     .Select(m => m.FirstOrDefault())
     .AsNoTracking().Take(request.Take);

主页为每个类别调用9次查询。使用第一个版本的查询,没有启用缓存并远程连接到SQL,页面加载大约为1.5秒,这使得应用程序在服务器上几乎是即时的,但第二种方式是当SQL远程时主页加载大约39秒。 / p>

如果不将整个查询重写到视图或存储过程中,是否可以修复它?

1 个答案:

答案 0 :(得分:1)

分组在数据库端是一项昂贵的操作。如果不知道数据库的外观以及您设置的索引,就很难确定。为什么不在数据到达后在客户端进行分组(假设其数量不是很大)。

这个问题解释了如何。 Group by in LINQ