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();

谢谢你,

LINQ Select Last &使用List从数据库中惟一记录

是的,您应该在数据库中通过连接两个表并使用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.ToArrayToList,我不知道你想用它做什么

如果你从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);