linq 左连接的有关问题
linq 左连接的问题
A表:传感器设备表
EquId: 设备ID
EquName:设备名称
B表:每10秒记录一次传感器数据值
DataId :数据ID
EquId:传感器设备ID(外键)
Value:传感器值
InsertTime:记录时间
要求:界面上10秒刷新一次数据,显示传感器名称及实时数据,实时数据是指当时时间过去的30秒内数据的平均值,如果过去30秒内都无数据则显示“已掉线”,否则显示平均值。
求一条简单的linq语句或者lambda表达式,尽量只访问一次数据库,查询速率快。
------解决思路----------------------
B表的查询条件也可以放在join的后面
------解决思路----------------------
至于你说的30秒无数据离线,可以写个三目运算的判断
Value = g.Any() ? data.Average(d => d.Value).ToString() : "离线"
------解决思路----------------------
楼上的基础上进行调整
------解决思路----------------------
lambda也来一下吧,不过我还是建议楼主建立视图进行查询,那样更简单
A表:传感器设备表
EquId: 设备ID
EquName:设备名称
B表:每10秒记录一次传感器数据值
DataId :数据ID
EquId:传感器设备ID(外键)
Value:传感器值
InsertTime:记录时间
要求:界面上10秒刷新一次数据,显示传感器名称及实时数据,实时数据是指当时时间过去的30秒内数据的平均值,如果过去30秒内都无数据则显示“已掉线”,否则显示平均值。
求一条简单的linq语句或者lambda表达式,尽量只访问一次数据库,查询速率快。
------解决思路----------------------
var query = from equ in A
join data in B.Where(d => System.Data.Objects.SqlClient.SqlFunctions.DateDiff("s", data.InsertTime, DateTime.Now) < 30).GroupBy(d => d.EquId)
on A.EquId equals data.Key into groups
from g in groups.DefaultIfEmpty()
select new
{
equ.EquId
equ.EquName,
Value = data.Average(d => d.Value),
};
B表的查询条件也可以放在join的后面
------解决思路----------------------
至于你说的30秒无数据离线,可以写个三目运算的判断
Value = g.Any() ? data.Average(d => d.Value).ToString() : "离线"
------解决思路----------------------
var query = from equ in A
join d in
(from b in B
where SqlFunctions.DateDiff("s", b.InsertTime, DateTime.Now) <= 30
group b by b.EquId into g
select new { ID = g.Key, Value = g.Average(d => d.Value) }
)
on A.EquId equals d.ID into groups
from d in groups.DefaultIfEmpty()
select new
{
equ.EquId,
equ.EquName,
Value = d == null ? null : d.Value
};
楼上的基础上进行调整
------解决思路----------------------
lambda也来一下吧,不过我还是建议楼主建立视图进行查询,那样更简单
var query = tableA.GroupJoin(tableB.Where(p => p.InsertTime >= DateTime.Now.AddSeconds(-30)), a => a.EquId, b => b.EquId, (a, b) => new
{
a.EquName,
a.EquId,
Value = b.Any() ? b.Average(p => p.Value).ToString() : "已掉线"
});