我在实体框架中设计的实体如下所示:

事件

  • EVENTID
  • 日期
  • 促进
  • 强度
  • 设备ID
  • 块标识
  • 设备

  • 块标识
  • DateStart
  • DateEnd
  • 活动

设备

  • 设备ID
  • 别号
  • 群ID
  • 活动

  • 群ID
  • 名称
  • 设备
  • RegionId

区域

  • RegionId
  • 名称
  • 集群

一个事件属于一个块,由设备注册。 设备属于群集,群集属于区域。

我想做的是获取一个块中事件的平均加速度和平均强度,并以列表中的对象进行组织,这些对象必须根据我是否想要获取一个块中事件的平均值进行组织被每个群集或每个区域中的设备检测到。

我应该在LINQ中使用哪种查询?

更清楚地说,这些是代表我要执行的操作的SQL字符串

select avg(e.Intensity) as average from blocks b, events e, devices d, clusters c, regions r where b.blockid = 1 and b.blockid = e.blockid and e.uniqueid= d.uniqueid and d.clusterid  = c.clusterid group by c.clusterid;

select avg(e.Intensity) as average from blocks b, events e, devices d, clusters c, regions r where b.blockid = 1 and b.blockid = e.blockid and e.uniqueid= d.uniqueid and d.clusterid  = c.clusterid and c.regionid = r.regionid group by c.regionid;

===============>>#1 票数:2 已采纳

也许像这样(对实体的限制)...

from ev in db.Events
where ev.Block.BlockID == 1
group ev by ev.Device.Cluster.Region.ID into g
// group ev by ev.Device.Cluster.ClusterID into g
select new
{
    RegionID = g.Key, // ClusterID = g.Key,
    AverageIntensity = g.Average(x => x.Intensity),
    AverageAcceleration = g.Average(x => x.Acceleration),
};

要添加其他字段,例如名称:

group ev by new { ID = ev.Device.Cluster.ClusterID, Name = ev.Device.Cluster.Name } 
into g  

要么

group ev by ev.Device.Cluster into g  
// ...
ClusterName = g.Key.Name,

(两者的SQL相同)

您可以有效地“分组”许多字段-但由于所有字段都是相同的(即,如果ID相同,名称相同)-您将不会更改分组的性质-您只需附加其他字段即可。

通常(无聚合),您还可以将“分组”添加到选择的Group = g,然后展平并返回所有记录等。

  ask by Uriel Arvizu translate from so

未解决问题?本站智能推荐: