2010-11-02 20 views
8

he el siguiente código:LinQ máximo fecha en una consulta optimizada

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; 

Sin embargo he estado tratando de conseguir la manera de optimizar ella, haciendo una consulta en lugar de uno ... cualquier sugerencia ??

+1

Este código no tiene sentido como está escrito: dailyDate nunca será nulo ... (DateTime no puede ser nulo) –

+0

lo siento, pero me preguntaba sobre el tema de tomar el máximo y obtener el balance – Necronet

Respuesta

14

Uso OrderByDescending y tomar el primer registro:

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

Este tipo de consulta se optimiza en SQL Server de forma que no se requiere una O (n log (n)) es un género de toda la tabla. Si hay un índice en DailyDate, encontrará la última fila en el índice, y sin un índice usará un algoritmo optimizado llamado Top N Sort que se ejecuta en tiempo lineal.

Sin embargo, esta consulta será O (n log (n)) en LINQ to Objects.

+1

Bastante seguro que te refieres a .OrderByDescending (c => c.DailyDate). –

+0

@Chris Shaffer: ¡Sí, gracias! –

+0

Eres increíble. – starmandeluxe