我在Entity Framework中设计的实体如下所示:
事件
块
设备
群集
区域
事件属于块并由设备注册。设备属于群集,群集属于区域。
我要做的是获取块中事件的平均加速度和平均强度,按照列表中的对象进行组织,这些对象必须根据我是否要获取事件的平均值来组织每个群集或每个区域中的设备检测到的块。
我应该使用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;
答案 0 :(得分:2)
也许是这样的事情(linq to entities)......
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,
中,然后展平并返回所有记录等。