如何从dbcontext

时间:2018-02-28 09:56:52

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

我将传感器数据存储在sql数据库中。每个条目都有device_id,时间戳,值和一些其他属性。

我想实现一个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 ...
}

此代码段会从clr引发无效的操作异常。据我所知,它创建了一个不在服务器端执行的语句。我的问题是我如何创建一个请求dbcontext上的最小值和最大值(每个设备)的查询?此外,我想知道实现这个的推荐方法,以便它不会在客户端执行。

谢谢Werner。

1 个答案:

答案 0 :(得分:0)

我希望你的_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)
                     }
           );