2010-11-02 9 views
8

Mam następujący kod:LinQ max w jednej kwerendzie Data Optimized

Decimal initialBalance; 
DateTime dailyDate = ctx.DailyBalances.Max(c => c.DailyDate); 
      if (dailyDate != null) 
       initialBalance = ctx.DailyBalances.Where(c => c.DailyDate == dailyDate).Select(c => c.FinalBalance).FirstOrDefault(); 
      else 
       initialBalance = 0; 

      return initialBalance; 

Niemniej Próbowałem dostać sposoby jego zoptymalizowane, dzięki czemu jedno zapytanie zamiast jednego ... żadnej sugestii ??

+1

Ten kod nie ma sensu, jak napisano: dziennaData nigdy nie będzie pusta ... (DateTime nie może być pusta) –

+0

Przepraszam, ale właśnie zastanawiałem się nad całym problemem wzięcia maksimum, a następnie uzyskania saldo – Necronet

Odpowiedz

14

Zastosowanie OrderByDescending i wziąć pierwszy rekord:

initialBalance = ctx.DailyBalances 
    .OrderByDescending(c => c.DailyDate) 
    .Select(c => c.FinalBalance) 
    .FirstOrDefault(); 

Ten typ kwerendy jest zoptymalizowany w SQL Server tak, że nie wymaga O (n log (n)) rodzaj całej tabeli. Jeśli istnieje indeks na DailyDate, znajdzie ostatni wiersz w indeksie, a bez indeksu użyje zoptymalizowanego algorytmu o nazwie Top N Sort, który działa w czasie liniowym.

Jednak to zapytanie będzie O (n log (n)) w LINQ do obiektów.

+1

Dość pewnie masz na myśli .OrderByDescending (c => c.DailyDate). –

+0

@ Chris Shaffer: Tak, dziękuję! –

+0

Jesteś świetny. – starmandeluxe

Powiązane problemy