2012-04-05 11 views
8

ho la struttura di datiLinq per selezionare gli ultimi record

enter image description here

Per ogni articolo c'è un record di suo prezzo in una certa data in ciascuna valuta. Devo creare una query che restituisca il prezzo più aggiornato per ciascuna valuta.

Questa query funziona, ma restituisce più Amounts per l'ID di valuta 1. Dovrebbe restituire solo 3 record, 7,8 and 9 in quanto questi rappresentano i prezzi più aggiornati in tutte le valute per questo articolo.

var q = (from c in db.tblStoreItemPrices where c.ItemID == ID select new { c.CurrencyID, c.Amount }); 

Si prega di ignorare tutti gli ordini e presupporre che i record siano ordinati a caso.

Grazie per qualsiasi aiuto!

+0

"dare per scontato che i record vengono ordinati in modo casuale" Non sarebbe più sensato avere un indice cluster diverso la chiave primaria al fine di ridurre questo random'ness per le prestazioni solo. – KingCronus

risposta

27

Questo dovrebbe funzionare:

db.tblStoreItemPrices 
    .Where(c => c.ItemID == ID) 
    .GroupBy(c => c.CurrencyID) 
    .Select(g => g.OrderByDescending(c => c.Date).First()) 
    .Select(c => new { c.CurrencyID, c.Amount }); 

Spiegazione:

  1. Selezionare le righe per la specifica ItemID
  2. Gruppo di currencyID
  3. all'interno di ogni gruppo moneta selezionare la riga che ha il maggior data recente (lasciando una riga per ogni CurrencyID nel set di risultati)
  4. Estrarre th e le informazioni che vuoi da queste righe
+1

Grazie - questo è stato di grande aiuto. In ASP.NET MVC 5 era solo un problema con First: dopo essere passato a FirstOrDefault, funzionava alla grande. Grazie ancora :) – Tunerx

+0

piuttosto che orderByDescending in base alla data, fai orderByDescending su id, perché id probabilmente indicizzato e associato ai dati più recenti, quindi la query sarà veloce. –

+0

ma la data della colonna è già indicizzata, quindi va bene –

Problemi correlati