2016-08-23 96 views
3

我有一張表,其中所有車輛都已註冊,另一張表中我爲每輛註冊車輛配備了數百萬個ping。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(); 

謝謝

回答

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,我不知道你想用它做什麼。

+0

Hi @Tim Schmelter。 謝謝你的幫助。 如果您看到圖像https://postimg.org/image/pc3agbm75/,則LINQ選擇整個數據庫,然後應用過濾器。這需要大約7秒鐘,這是因爲我目前只有63884行。使用它爲每個需要1秒選擇整個數據。 反正有沒有爲每個選擇最後的ping? – Canela

2

如果您的NuGet你會發現.maxby()方法得到moreLinq:在不同的上下文 例如:

//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

+0

我試過了,但是我得到了異常System.OutOfMemoryException,因爲它可能讀取了超過65k行的整個表。請參閱下面的代碼 'var query = _db.Tracks.Where(r => r.Vehicle.isActive && r.Vehicle.helperLastPing> timeRestriction); var maxBy = query.MaxBy(track => track.vehicle_fleetNumber);' 感謝您的幫助 – Canela

+0

您可以通過在SQL服務器端引入視圖並查詢該視圖來限制結果。它應該使數據更快更容易地工作。 –

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);最後數據

+0

感謝隊友 它只會選擇車輛信息和車輛,並平有不同的表。 的'helperLastPing'列有車輛表內的最後一個平信息,因爲它可以幫助我做其他的檢查,而不選擇'Tracks'表,但所有的ping請求的信息是跟蹤表內。 假設我在車輛表中有車輛1,2和3。每個車輛的「軌道」表可能有100萬坪或更多。 我想要做的是選擇每個最後的車輛的平,而沒有選擇所有的軌道表將是巨大的。 – Canela