【问题标题】:How to get average, minimum and maximum with fewer database round-trips? [duplicate]如何以更少的数据库往返次数获得平均值、最小值和最大值? [复制]
【发布时间】:2019-09-05 11:00:47
【问题描述】:

在使用 Entity Framework Core 的 ASP.NET Core Razor Pages 应用程序中,我使用下面的代码从数据库中填充平均值、最小值和最大值的列表。虽然这适用于迄今为止记录的相对较小的数据量,但我认为它不会随着数据量的增长而很好地扩展。是否有更有效的方法在应用程序中执行此操作,或者我应该忘记在应用程序代码中执行此操作并从存储过程中获取它?

ServerStatsList = _context
    .PerfLog
    .Select(l => new ServerStats {
        CompanyName = l.CompanyName,
        ServerName = l.ServerName,
        Average = 0,
        Minimum = 0,
        Maximum = 0
    })
    .Distinct()
    .ToList();

foreach (ServerStats s in ServerStatsList)
{
    s.Average = _context
        .PerfLog
        .Where(l => l.CompanyName == s.CompanyName && l.ServerName == s.ServerName)
        .Average(l => l.MemoryAvailableMBytes);
    s.Minimum = _context
        .PerfLog
        .Where(l => l.CompanyName == s.CompanyName && l.ServerName == s.ServerName)
        .Min(l => l.MemoryAvailableMBytes);
    s.Maximum = _context
        .PerfLog
        .Where(l => l.CompanyName == s.CompanyName && l.ServerName == s.ServerName)
        .Max(l => l.MemoryAvailableMBytes);
}

【问题讨论】:

  • 谢谢 Selvin,我去看看
  • PerfLog.GroupBy(l=> new { l.CompanyName, l.ServerName}).Select(g=>new ServerStats { CompanyName = g.Key.CompanyName, ... Maximum = g.Max(l=>l.MemoryAvailableMBytes) }) 我没有测试过……但总体思路

标签: c# linq asp.net-core entity-framework-core


【解决方案1】:

尝试以下方法:

var statsPerfLog = _context
    .PerfLog
    // group logs by the tuple [CompanyName, ServerName]
    // and select the `MemoryAvailableMBytes` from every log
    .GroupBy(l => new {l.CompanyName, l.ServerName}, l => l.MemoryAvailableMBytes)
    .Select(group => new ServerStats
    {
        CompanyName = group.Key.CompanyName,
        ServerName = group.Key.ServerName,
        Average = group.Average(),
        Minimum = group.Min(),
        Maximum = group.Max()
    })
    .ToList();

【讨论】:

    猜你喜欢
    • 2021-04-14
    • 1970-01-01
    • 2018-07-07
    • 2018-07-16
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 2017-07-24
    相关资源
    最近更新 更多