LinQ max Дата в одном запросе оптимизирована - PullRequest
9 голосов
/ 02 ноября 2010

У меня есть следующий код:

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;

Тем не менее я пытался найти способы оптимизировать его, делая один запрос вместо одного ... любое предложение ??

1 Ответ

18 голосов
/ 02 ноября 2010

Используйте OrderByDescending и возьмите первую запись:

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

Этот тип запроса оптимизирован в SQL Server, поэтому для него не требуется сортировка O (n log (n))весь столЕсли на DailyDate есть индекс, он найдет последнюю строку в индексе, а без индекса он будет использовать оптимизированный алгоритм с именем Top N Sort, который выполняется за линейное время.

Однако этот запрос будет O (n log (n)) в LINQ to Objects.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...