gpt4 book ai didi

mysql - 从大型 IEnumerable 获取计数

转载 作者:行者123 更新时间:2023-11-29 17:21:02 25 4
gpt4 key购买 nike

我有一个由 3 个内部连接表组成的数据集,其中包含来自 MySQL 数据库的大约 18,000 条记录。我的函数应该获取所有相关数据,然后通过用户提供的一些参数对其进行过滤,然后返回应用过滤器的项目数。

当我使用标准数据读取器时,这确实工作得很好,但是我刚刚将应用程序转移到使用 Entity Framework 来尝试提高性能,为此我正在使用 LazyLoadingProxies - 我认为这与问题相关。

我的函数的主要部分是

  1. 获取所有数据项
  2. (对于每个参数)克隆所有数据项
  3. 获取已过滤项目的数量

代码如下所示

var EventsLogged = context.EventLogs.Where(x => x.Event.GameId == request.GameId
&& (!request.EventId.HasValue || x.EventId == request.EventId.Value)
&& (!request.StartTime.HasValue || x.Created >= request.StartTime.Value)
&& (!request.EndTime.HasValue || x.Created <= request.EndTime.Value));




if (EventsLogged.Count() <= 0)
{
response.AddErorrMessage("No data found for Event.");
}
else
{
//Some other stuff happens here not related to do with working on the parameters

IEnumerable<EventLogs> filteredEvents = EventsLogged;
filteredEvents = FilterResultsSet(filteredEvents, parametervalue);

return filteredEvents.Select(x => x.UserId).Distinct().Count();
}

该函数工作正常,过滤也很好,然后当我们点击 Select.Distinct().Count() 时,处理时间猛增到了疯狂的程度 - 我等了大约 20 分钟才放弃。

在我的输出窗口中,我可以看到 SQL 的部分正在输出,就好像此时实际上正在执行查询一样,但一次只有 1 条记录。

从我已经看到的内容来看,获取 IEnumerable 的计数有一些规则,并且要获取必须对其进行计数的计数。

由于我不关心此查询中的任何内容,只关心计数,因此有什么方法可以实现此目的 - 或者我是否需要重新考虑我的整个策略。

最佳答案

在遵循这两条评论的建议后,我尝试从搜索中删除 NULLABLE 项目。然而这并没有进一步优化。

正如怀疑的那样,这是 LazyLoadingProxies 引起的问题 - 当运行 .SELECT() Entity Framework 时,它会关闭并尝试填充我的数据集,但是它没有我真正想要的上下文,因此它正在尝试解决,并且获取大量数据;其中也有一个关系循环,即 4 个表通过外键链接在一起 - 所以我想它试图一次性解决这个问题。

当我删除延迟加载时,我必须使用 .Include() 和 .ThenInclude() 选项指定要解析的导航属性。

工作代码如下

List<EventsLogged> EventsLogged = context.EventLogs
.Include(log => log.Session)
.Include(log => log.EventParameterValues)
.ThenInclude(val => val.EventParameter)
.Where(x => x.Event.GameId == request.GameId).ToList();

关于mysql - 从大型 IEnumerable 获取计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51254083/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com