在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(),否则会产生一对多的数据结果
现在需要以小时进行分组统计每个时间段的最大值,最小值,和平均值
同时,另一个表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(),否则会产生一对多的数据结果
相关文章推荐
- linq实现两表关联查询,使用group by进行分组
- MySQL中使用group by进行分组时,子查询中order by失效的问题
- 使用聚合函数group by后面必须要带着所有要查询的列,但是我只想根据group by后面的第一个列进行分组,怎么办? [
- Excel 中使用SQL 语句查询数据(八)-----用Group by 进行分组统计
- Linq使用Group By分析 Entity Framework 使用注意:Where查询条件中用到的关联实体不需要Include
- 使用子查询进行编号重排的处理示例.sql
- 使用IsolatedStorage新建XML文件,并且用LINQ查询XML
- Linq 分组(group by)求和(sum)并且按照分隔符(join)分割列数据
- MYSQL使用inner join 进行 查询/删除/修改示例
- Access使用查询--1.2.用选择查询进行分组数据的计算
- C# 使用Dictionary、linq实现根据集合里面的字符串进行分组
- LINQ下使用三层架构的探索(四)建立一个逻辑访问层,并且添加一些查询方法
- Silverlight 使用IsolatedStorage新建XML文件,并且用LINQ查询XML
- Oracle基本分组查询group by的使用
- 使用LINQ技术进行数据查询的顺序如下所示
- linq 扩展,在查询中使用字符串表达式对结果进行排序
- 如何在 LINQ 中使用 Object.ToString() 进行查询
- Entity Framework 4 in Action读书笔记——第四章:使用LINQ to Entities查询:分组数据
- 使用LINQ to Entities查询:分组数据
- 使用LINQ技术进行数据查询的顺序如下所示