1. 程式人生 > >在entity framework 中使用 LINQ 對錶進行左關聯查詢且group by 分組查詢的示例,並且按小時分組查詢時間段

在entity framework 中使用 LINQ 對錶進行左關聯查詢且group by 分組查詢的示例,並且按小時分組查詢時間段

有表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(),否則會產生一對多的資料結果