在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,
}
{
r.DeviceId,
r.NodeId,
t.Year,
t.Month,
t.Day,
t.Hour
}
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),
};
紅色部分是分組後保留的篩選結果
藍色部分是要分組的列
最後要注意結果中不需要聚合函式處理的值,都必須加FirstOrDefault(),否則會產生一對多的資料結果