您的位置:首页 > 其它

在entity framework 中使用 LINQ 对表进行左关联查询且group by 分组查询的示例,并且按小时分组查询时间段

2017-11-29 16:57 573 查看
有表RealTimeDatas的字段RecordTime存储了实时时间,格式为DateTime

现在需要以小时进行分组统计每个时间段的最大值,最小值,和平均值

同时,另一个表Devices中有标准温度湿度最大最小值范围,需要将这个结果一并关联到查询结果中

            var query = from r in context.RealTimeDatas.AsEnumerable()

                        join d in context.Devices on r.DeviceId equals d.DeviceId into dJoined

                        from d in dJoined.DefaultIfEmpty()

                        where sTime <= r.RecordTime && r.RecordTime <= eTime

                        let t = r.RecordTime

                        group new

                        {

                            r.DeviceId,

                            r.NodeId,

                            r.RecordTime,

                            d.MinTem,

                            d.MaxTem,

                            d.MinHum,

                            d.MaxHum,

                            r.Tem,

                            r.Hum,

                        } by new

                        {

                            r.DeviceId,

                            r.NodeId,

                            t.Year,

                            t.Month,

                            t.Day,

                            t.Hour

                        } into rGroup

                        select new

                        {

                            DeviceId = rGroup.Select(t => t.DeviceId).FirstOrDefault(),

                            NodeId = rGroup.Select(t => t.NodeId).FirstOrDefault(),

                            Time = rGroup.Select(t => t.RecordTime).FirstOrDefault().ToString("yyyy-MM-dd HH"),

                            s_MinTem = rGroup.Select(t => t.MinTem).FirstOrDefault(),

                            s_MaxTem = rGroup.Select(t => t.MaxTem).FirstOrDefault(),

                            s_MinHum = rGroup.Select(t => t.MinHum).FirstOrDefault(),

                            s_MaxHum = rGroup.Select(t => t.MaxHum).FirstOrDefault(),

                            AvgTem = Math.Floor(rGroup.Average(t => t.Tem)),

                            MinTem = rGroup.Min(t => t.Tem),

                            MaxTem = rGroup.Max(t => t.Tem),

                            AvgHum = Math.Floor(rGroup.Average(t => t.Hum)),

                            MinHum = rGroup.Min(t => t.Hum),

                            MaxHum = rGroup.Max(t => t.Hum),

                        };

其中AsEnumerable()用于将结果具象化进行tostring操作,否则无法对查询的RecordTime进行时间格式转换
红色部分是分组后保留的筛选结果

蓝色部分是要分组的列

最后要注意结果中不需要聚合函数处理的值,都必须加FirstOrDefault(),否则会产生一对多的数据结果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐