【问题标题】:Correct way to have statistics from child entities从子实体获取统计信息的正确方法
【发布时间】:2019-09-12 20:05:10
【问题描述】:

请帮我找到一种方法来提高效率

该程序具有以下实体:
项目 1-N 模块
模块 1-N 个子模块。
子模块 1-N 段 .
每个段都有不同的状态(默认/已完成)和字数

字数是在将句段插入数据库并存储在列中时进行的。

观看次数。 项目列表 应该有少于 100 个项目,因此我列出了所有项目,但不包括在内。

模块列表(参数为 1 projectId)应该有一列包含单词已完成/总计和行数已完成/总计

子模块列表(参数为 1 moduleId)应该有一列包含已完成的单词/总计和已完成的行数/总计

假设我每个模块大约有 50k 行(段)。所以性能是必须的。

选项 1: 某种 IQueryable Childs.Count()
选项 2: 使用 CRON 作业将 Stats 列添加到数据库中的表以更新它们 或者在 mysql 中有一个存储过程/触发器。
选项 3?: 在 mysql 中创建 2 个视图?从未做过,但也许它们适合这项工作?
建议的选项:还没有

以前从未使用过如此大的数据集,性能是必须的。 请指教

【问题讨论】:

  • 您的具体问题是什么?请显示不起作用的代码。
  • 并不是说它不起作用,我不知道计算此类儿童实体统计数据的正确方法是什么。它们是大桌子,每次加载视图时都不想让服务器着火。具体问题是:如何在视图中有效地显示已完成的单词/总单词
  • 为什么不尝试这 3 个选项并衡量差异呢?通常,数据库端的视图是最快的。

标签: c# mysql asp.net performance entity-framework


【解决方案1】:
var query = _context.Submodules.Where(t => t.Id == id)
                    .Select(e => new Submodules{
                        Id = e.Id,
                        Name = e.Name,
                        Status = e.Status,
                        Token = e.Token,
                        ModuleId = e.ModuleId,
                        Gender = e.Gender,
                        TotalRows = e.TotalRows,
                        TotalWords = e.TotalWords,
                        CompletedWords = e.Segments.Where(a => a.Status == Abr.Recorded).Sum(y=> y.Wordcount),
                        CompletedRows = e.Segments.Where(a => a.Status == Abr.Recorded).Count()
                    }).ToList();

【讨论】:

    猜你喜欢
    • 2020-05-08
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    相关资源
    最近更新 更多