Обновление 2 : Я просто хочу ответить на это:
однако, если вы делаете что-то подобное
на столе северного ветра, это будет
производить тот же результат [...] Так что я
не может принять ни одного из 3 ответов
которые говорят, что запросы разные
Я не хотел спорить, что они должны дать тот же результат . Чтобы лучше проиллюстрировать мою точку зрения, позвольте мне привести аналогию.
Допустим, я даю вам перетасованную стопку учетных карточек, пронумерованных от 1 до 50, и говорю: «Приведите все это в порядок». Таким образом, вы проходите и сортируете их, убеждаясь, что куча идет от 1 до 50. Это займет у вас минуту или две. Тогда Я говорю: «Теперь дай мне карточку наверху колоды». Эта карта будет иметь номер 50.
С другой стороны, предположим, во-первых, все, что я сказал, было: «Дайте мне карту с наибольшим номером из этой колоды». Затем все, что вам нужно сделать, - это просмотреть карточки и найти ту, которая имеет наибольшее число, без необходимости выполнять какую-либо сортировку. (Я имею в виду, что вы могли бы сначала отсортировать кучу, но это явно принесет больше, чем я просил.)
Итак, я говорю, что результаты из двух вышеуказанных наборов инструкций будут одинаковыми; однако, они явно разные инструкции .
Теперь меня совсем не удивит, если некоторые реализации будут достаточно умными, чтобы перевести их в идентичные (оптимизированные) запросы SQL; все, что я говорю, это то, что, поскольку они являются различными инструкциями , не должно быть таким удивительным, если результирующий SQL отличается (и хотя это может быть неудачным поэтому неудивительно, что одна версия может вызвать ошибку, а другая - нет.
Обновление : Опять же, я не могу дать вам подробный ответ с точки зрения Linq-to-SQL; но я укажу, что хотя Max
теоретически должно давать тот же результат , что и OrderByDescending
вместе с FirstOrDefault
, с концептуальной точки зрения это не совсем то же самое.
Рассмотрим Linq-to-objects. Вызов Max
будет повторять последовательность и накапливать максимальное значение. Вызов OrderByDescending
отсортирует всю последовательность и , затем возьмет верх.
Очевидно, что Linq-to-SQL - другое животное; однако имеет смысл, что, поскольку эти запросы представляют концептуально разные подходы для получения определенного результата, SQL-запрос, который они производят, вполне может быть (и, как вы видели, - это ) иным.
Оригинальный ответ
Я не могу дать вам подробный ответ с точки зрения Linq-to-SQL, но я укажу, что между вашими двумя альтернативами есть очень серьезное различие (они не эквивалентны) :
Max(x => x.Timestamp)
Выше должно возвращаться наибольшая отметка времени .
OrderByDescending(x => x.Timestamp()).FirstOrDefault()
Вышеприведенное должно вернуть запись с наибольшей отметкой времени .
Это очень разные звери.