我正在使用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年等),并基于性别(名称可能是男性和女性),然后根据这些总和频率按降序对它们进行排序。然后你从顶部拿出你想要显示的任何数字来显示最流行的名字。