LINQ Select Last &使用List从数据库中惟一记录
本文关键字:数据库 记录 List Select Last 使用 LINQ | 更新日期: 2023-09-27 18:03:37
我有一个表,其中所有车辆都已注册,另一个表中每辆注册车辆都有数百万个ping。
我正在尝试从使用LINQ QUERY在过去30分钟内发送ping的每个车辆中选择最后一个ping。我已经通过"for each"的想法完成了下面的代码,但我不确定这是否是最好的方法。
我想知道是否有更好的方法来选择这个使用单行?我知道我可以通过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();
谢谢你,
是的,您应该在数据库中通过连接两个表并使用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
,我不知道你想用它做什么
如果你从nuget得到moreLinq,你会发现。maxby()方法:例如,在不同的上下文中:
//get the correct exchange rate
var rateList = _db.lists_ExchangeRates.Where(
rates => rates.Currency == currencyCode);
Decimal? exRate = rateList.MaxBy(rates => rates.LastUpdated).ExchangeRate;
MoreLinq maxBy vs LINQ max + where
在我的例子中,如果我想要最后保存的数据,我使用这个方法
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);