需要帮助使用ASP.NET Core优化LINQ查询

时间:2017-07-18 17:35:33

标签: c# linq-to-sql asp.net-core asp.net-core-mvc

我正在使用ASP.NET Core MVC应用程序,我需要一些帮助来优化我的LINQ查询。目前我的应用程序运行速度非常慢,我认为这是由于我编写查询的方式。我的SQL数据库包含大约190万行数据,每个项目有4个属性。

以下是我在控制器中的示例...

model.MostPopular = await _givenNameRepo.GetByAlphaSinceYear(model.StartsWith, model.Gender, model.SortCount, model.SinceYear).ToAsyncEnumerable().ToList();

这就是我在回购中所拥有的......

public IEnumerable<string> GetByAlphaSinceYear(string alpha, string gender, int sortCount, int sinceYear)
    {
        var names = (from n in _context.AsNoTracking()
                     where n.Name.StartsWith(alpha) && n.Gender == gender && n.Year >= sinceYear
                     group n by new { n.Name } into nn
                     select new
                     {
                         nn.Key.Name,
                         Frequency = nn.Sum(s => s.Frequency)
                     }).OrderByDescending(i => i.Frequency)
                       .Select(j => j.Name).Take(sortCount);

        return names;
    }

我正在尝试使repo灵活,允许同步或异步操作。但我现在认为这可能会导致问题,因为我必须在控制器中做些什么。

我想的一个问题是我的查询是否按照我调用它的方式多次运行?我已经阅读了LINQ文档,但是当某些延迟操作正在执行时,它并没有陷入我的脑海。据我了解,第一次运行将在.OrderByDescending上,并在该结果上.Select将运行,并在该结果上.Take将运行。但是在控制器中,因为我试图异步运行,我认为需要调用.ToAsyncEnumerable然后调用.ToList。我的直觉告诉我这里还有一些额外的工作,但我不确定。

编辑:数据库中只有一个表,它看起来像这样......

Id | Year | Name | Gender | Frequency

每年都有自己的性别和频率。样本查询通过总结名称的频率,在若干年(去年,过去5年,过去10年等),并基于性别(名称可能是男性和女性),然后根据这些总和频率按降序对它们进行排序。然后你从顶部拿出你想要显示的任何数字来显示最流行的名字。

0 个答案:

没有答案