1

我在 Entity Framework 中设计的实体如下所示:

事件

  • 事件 ID
  • 日期
  • 加速
  • 强度
  • 设备编号
  • 区块标识
  • 设备
  • 堵塞

堵塞

  • 区块标识
  • 开始日期
  • 日期结束
  • 活动

设备

  • 设备编号
  • 别名
  • 集群 ID
  • 活动

  • 集群 ID
  • 姓名
  • 设备
  • 区域 ID

地区

  • 区域 ID
  • 姓名
  • 集群

一个 Event 属于一个 Block,由一个 Device 注册。一个设备属于一个集群,一个集群属于一个区域。

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

我应该使用 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;
4

1 回答 1

2

也许是这样的(linq to entity)......

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,,然后展平并返回所有记录等。

于 2013-04-18T02:12:37.160 回答