2010-11-02 4 views
8

Je le code suivant:LinQ max date dans une requête Optimisée

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; 

Néanmoins j'ai essayé d'obtenir des moyens d'optimiser ce, faire une requête au lieu d'un ... tout Sugestion ??

+1

Ce code n'a pas de sens comme écrit: dailyDate ne sera jamais nul ... (DateTime ne peut pas être nul) –

+0

désolé votre droit juste mais je me demandais à propos de la question de prendre le maximum et ensuite obtenir le balance – Necronet

Répondre

14

Utilisez OrderByDescending et prendre le premier enregistrement:

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

Ce type de requête est optimisée dans SQL Server afin qu'il ne nécessite pas d'O (n log (n)) sorte de la table entière. S'il y a un index sur DailyDate il trouvera la dernière rangée dans l'index, et sans index il utilisera un algorithme optimisé appelé Top N Sort qui s'exécute en temps linéaire. Toutefois, cette requête sera O (n log (n)) dans LINQ to Objects.

+1

Assez sûr que vous voulez dire .OrderByDescending (c => c.DailyDate). –

+0

@Chris Shaffer: Oui, merci! –

+0

Vous êtes génial. – starmandeluxe