我有以下实体框架查询:
var queryResponse = await db.DataPoints.GroupBy(x => x.Device).Select(x => new
{
lon = x.Key.DataPoints.OrderByDescending(y => y.DateTime).Select(y => y.Longitude).FirstOrDefault(),
lat = x.Key.DataPoints.OrderByDescending(y => y.DateTime).Select(y => y.Longitude).FirstOrDefault(),
date = x.Key.DataPoints.OrderByDescending(y => y.DateTime).Select(y => y.DateTime).FirstOrDefault(),
label = x.Key.Name,
})
.OrderByDescending(x => x.label)
.ToListAsync();
现在你可以在我的选择中看到,我必须得到lon
,'lat'和'date'。但是我这样做的方式,我必须orderby
并选择第一个3次。 'DataPoints'是一个非常大的表。
在C#中我通常会执行orderBy
一次,只需选择整个对象,然后再将其分解为3个属性。但是在这种情况下,我希望SQL返回确切的字段。
是否有更有效的方式来编写此查询?
答案 0 :(得分:1)
试试这个:
var queryResponse =
(from g in db.DataPoints.GroupBy(x => x.Device)
let latestDataPoint = g.Key.DataPoints.OrderByDescending(p => p.DateTime)
.FirstOrDefault()
select new
{
lon = latestDataPoint.Longitude,
lat = latestDataPoint.Latitude,
date = latestDataPoint.DateTime,
label = g.Key.Name
})
.OrderByDescending(x => x.label)
.ToList();