2017-07-17 3 views
0

選択トップで複数の順序を最適化:EFは、私は、次のEntity Frameworkのクエリを持っている1

var queryResponse = await db.DataPoints.GroupBy(x => x.Device).Select(x => new 
    { 
     lon = x.Key.DataPoints.OrderByDescending(y => y.DateTime).Select(y => y.Longitude).FirstOrDefault(), 
     lat = x.Key.DataPoints.OrderByDescending(y => y.DateTime).Select(y => y.Longitude).FirstOrDefault(), 
     date = x.Key.DataPoints.OrderByDescending(y => y.DateTime).Select(y => y.DateTime).FirstOrDefault(), 
     label = x.Key.Name, 

    }) 
     .OrderByDescending(x => x.label) 
     .ToListAsync(); 

今、あなたは私の選択では見ることができ、私はlon、「緯度」を取得する必要がありますし、「日付」。しかし、私はそれをやっている方法は、私はorderbyし、最初の3回を選択する必要があります。 'DataPoints'は非常に大きなテーブルです。

私は通常、orderByを1回実行してオブジェクト全体を選択し、後で3つのプロパティに分割します。しかし、この場合、SQLは正確なフィールドを返すようにします。

このクエリを書くより効果的な方法はありますか?

答えて

1

これを試してみてください:

var queryResponse = 
    (from g in db.DataPoints.GroupBy(x => x.Device) 
    let latestDataPoint = g.Key.DataPoints.OrderByDescending(p => p.DateTime) 
          .FirstOrDefault() 
    select new 
    { 
     lon = latestDataPoint.Longitude, 
     lat = latestDataPoint.Latitude, 
     date = latestDataPoint.DateTime, 
     label = g.Key.Name 
    }) 
    .OrderByDescending(x => x.label) 
    .ToList(); 
関連する問題