linq 左连接的有关问题

linq 左连接的问题
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() : "已掉线"
});