2016-08-23 3 views
3

私はすべての車両が登録されているテーブルと、登録されている各車両に何百万というpingがあるテーブルを持っています。LINQリストを使ってDBからLast&Uniqueレコードを選択

LINQ QUERYを使用して過去30分間にpingを送信した各車両から最後のpingを選択しようとしています。私は、それぞれのアイデアごとに以下のコードを実行しましたが、それが最善の方法であるかどうかはわかりません。

これを1行で選択するより良い方法があるかどうかを知りたいですか?私は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を使用してデータベースにそれを行う必要があり、

答えて

2

ありがとう:

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) 
{ 
    // ... 
} 

代わりに、あなたはまた、query.ToArrayまたはToListを使用することができますforeachの、私はあなたがそれで何をしたいのか分かりません。

+0

こんにちは@Tim Schmelter。 ご協力いただきありがとうございます。 イメージが表示されている場合は、LINQはデータベース全体を選択してからフィルタを適用します。それは約7秒を取っている、そして、私は63884行しか今のところ持っていないからです。それぞれを使用すると、データ全体を選択するのに1秒かかります。 最後のpingだけを選択する方法はありますか? – Canela

2

あなたは.maxby()メソッドがありますnugetから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

ありがとうございます 車両の情報と車両とpingの選択は異なるテーブルのみです。 車のテーブルの最後のping情報は 'helperLastPing'カラムにあります。これは' Tracks'テーブルを選択せず​​に他のチェックをするのに役立ちますが、すべてのping情報はTrackテーブルの中にあります。 車のテーブルの中に車1,2と3があります。 「トラック」テーブルは、すべての車両に対して100万ピング以上のピングを有する可能性がある。 私がしようとしているのは、トラックテーブルが巨大になるため、すべてを選択せず​​に最後の車両のpingを選択することです。 – Canela

関連する問題