我有一张桌子,所有车辆都已注册,另一张桌子上有每张注册车辆数百万坪。
我尝试使用LINQ QUERY从过去30分钟内发送ping的每辆车中选择最后一次ping。我已经通过"为每个"完成了下面的代码。想法,但我不确定这是否是最佳方式。
我想知道是否有更好的方法可以使用一条线来选择它?我知道我可以"分组"他们使用vehicle_fleetNumber,但由于TAKE()限制了最终结果,我无法获得正确的结果。
var timeRestriction = DateTime.UtcNow.AddMinutes(-30);
var x = _db.Vehicles.Where(r=> r.isActive.Equals(true) && r.helperLastPing > timeRestriction);
foreach (var vehicle in x)
{
var firstOrDefault = _db.Tracks.OrderByDescending(r => r.collectedOn)
.FirstOrDefault(r => r.vehicle_fleetNumber.Equals(vehicle.fleetNumber));
}
return View();
谢谢,
答案 0 :(得分:2)
是的,您应该通过加入两个表并使用GroupBy
:
var query = from v in _db.Vehicles
join t in _db.Tracks
on v.fleetNumber equals t.vehicle_fleetNumber
where v.isActive && v.helperLastPing > timeRestriction
group t by t.vehicle_fleetNumber into vehicleGroup
select vehicleGroup.OrderByDescending(x => x.collectedOn).First();
foreach(var track in query)
{
// ...
}
除了foreach
您还可以使用query.ToArray
或ToList
,我不知道您想用它做什么。
答案 1 :(得分:2)
如果你从nuget获得更多的linq,你会发现.maxby()方法: 例如,在不同的背景下:
//get the correct exchange rate
var rateList = _db.lists_ExchangeRates.Where(
rates => rates.Currency == currencyCode);
Decimal? exRate = rateList.MaxBy(rates => rates.LastUpdated).ExchangeRate;
另见下文,这提供了更多信息。
答案 2 :(得分:0)
在我的情况下如果我想要保存的最后一个数据我使用这个方法
var id = db.DPSlips.Max(item => item.Id);
所以我认为这可能会起作用,只会尝试
var timeRestriction = DateTime.UtcNow.AddMinutes(-30);
var x = _db.Vehicles.Max(a => a.isActive == true && a.helperLastPing > timeRestriction);