【问题标题】:How to get the min and max value from a dbcontext如何从 dbcontext 中获取最小值和最大值
【发布时间】:2018-02-28 09:56:51
【问题描述】:

我将传感器数据存储在 sql 数据库中。每个条目都有一个 device_id、timestamp、value 和一些其他属性。

我想实现一个 webapi 函数,它返回我从传感器设备接收到的第一个和最后一个事件。所以我的序列化 DTO 应该是这样的: { "start": <timestamp:long>, "end": <timestamp:long>, "deviceid": <someid:string>}

我正在使用 Entityframework Core 来访问我的数据库。我可以毫无问题地获得唯一设备 ID 的列表。如果我尝试获取每个设备的时间戳的最小值或最大值,我的 dbcontext 会引发无效操作异常。

我尝试了几件这样的事情:

var deviceList=_context.Data.Select(d=>d.DeviceId).Distinct();
foreach(string deviceId in deviceList)
{
   var max = _context.Data.Where(g=>g.DeviceId==deviceId).Max(c=>c.Timestamp);
   var min ...
}

这个 sn-p 从 clr 抛出一个无效的操作异常。据我了解,它创建了一个不在服务器端执行的语句。我的问题是如何创建一个查询来请求 dbcontext 上的最小值和最大值(每个设备)?另外我想知道推荐的实现方式是什么,这样它就不会在客户端执行。

谢谢维尔纳。

【问题讨论】:

  • 有什么异常?
  • 我建议不要将 EF Core 用于生产,除非您的应用程序非常简单。

标签: sql-server linq entity-framework-core


【解决方案1】:

我期待您的_context.Data 指的是表中的所有记录(行)。你可以使用group by 来获取它。试试下面的一个,让我知道它是否适合你。

首先我们按设备 ID 分组,然后对于每个组,我们得到最小和最大时间跨度。

var data = _context.Data.GroupBy(f => f.deviceId)
    .Select(g =>
                new { 
                      deviceId = g.Key,
                      start = g.Min(r=>r.timestamp),
                      end = g.Max(r=>r.timestamp)
                     }
           );

【讨论】:

  • 是的,Data 是我的 DbContext 中我的 DbSet 的名称。不幸的是,这也会引发异常:
  • Connection id "0HLBULVGGJSBN", Request id "0HLBULVGGJSBN:00000001":应用程序抛出了未处理的异常。 System.Reflection.TargetInvocationException:调用的目标已引发异常。 ---> System.InvalidOperationException:警告作为警告“Microsoft.EntityFrameworkCore.Query.QueryClientEvaluationWarning”的错误异常:无法翻译 LINQ 表达式“GroupBy([f].DeviceId, [f])​​”并将在本地进行评估.要抑制此异常,请使用 DbContextOptionsBuilder.ConfigureWarnings API。
  • 你在使用 EF Core 吗? EF Core 不支持服务器端 Group By,直到 v2.1 发布。
  • 嗯,是的,我正在使用 EF Core。我不知道这不受支持。我将使用原始 sql 语句来实现我的查询并接受这个答案,因为还没有可用的解决方案。谢谢!
  • @NetMage 你有没有注意到有问题的是_context.Data.select 意味着他正在循环完整的集合,我也是。是的,它不是服务器上的组,实际上它会提取所有对象,然后按分组,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多