2012-04-05 12 views
8

Mam struktury danychLINQ aby wybrać ostatnie rekordy

enter image description here

dla każdej pozycji znajduje się zapis, że cena w określonym terminie w każdej walucie. Potrzebuję utworzyć zapytanie, które zwróci najbardziej aktualną cenę dla każdej waluty.

To zapytanie działa, ale zwraca wiele Amounts dla waluty ID 1. Powinien zwracać tylko 3 rekordy, 7,8 and 9, ponieważ są one najbardziej aktualnymi cenami we wszystkich walutach dla tego przedmiotu.

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

Proszę zignorować wszystkie zamówienia i założyć, że rekordy są losowo sortowane.

Dzięki za pomoc!

+0

„Zakładamy, że zapisy są losowo nakazał” Czy nie byłoby bardziej sensowne, aby mieć indeks klastra innego niż klucz podstawowy w celu zmniejszenia tego random'ness do wykonywania samodzielnie. – KingCronus

Odpowiedz

27

To powinno działać:

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 }); 

Objaśnienie:

  1. Wybierz wiersze dla konkretnego ItemID
  2. grupy poprzez CurrencyID
  3. od wewnątrz każdej grupy waluty wybrać wiersz, który ma najbardziej ostatnia data (pozostawiając jeden wiersz dla każdego CurrencyID w zestawie wyników)
  4. Wyciągnij Informacje o e chcesz z tych wierszy
+1

Dzięki - to była świetna pomoc. W ASP.NET MVC 5 był to po prostu problem z First - po zmianie na FirstOrDefault działał świetnie. Jeszcze raz dziękuję :) – Tunerx

+0

a następnie orderByDescending na podstawie daty, do orderByDescending na id, ponieważ identyfikator prawdopodobnie został zindeksowany i powiązany z najnowszymi danymi, więc zapytanie będzie szybkie. –

+0

, ale data zakończenia kolumny już jest indeksowana, to jest w porządku –

Powiązane problemy