LINQ Select Last&来自DB的唯一记录使用List

时间:2016-08-23 08:47:25

标签: c# sql-server asp.net-mvc linq

我有一张桌子,所有车辆都已注册,另一张桌子上有每张注册车辆数百万坪。

我尝试使用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();

谢谢,

3 个答案:

答案 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.ToArrayToList,我不知道您想用它做什么。

答案 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;

另见下文,这提供了更多信息。

MoreLinq maxBy vs LINQ max + where

答案 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);