Это ограничение сводится к тому, что в конечном итоге он должен перевести этот запрос в SQL , а SQL имеет SELECT TOP
(в T-SQL), но не SELECT BOTTOM
(такого нет).
Хотя есть простой способ обойти это, просто убавить порядок и затем сделать First()
, что вы и сделали.
РЕДАКТИРОВАТЬ: Другие поставщики, возможно, будут иметь различные реализации SELECT TOP 1
, в Oracle это может быть что-то более похожее на WHERE ROWNUM = 1
РЕДАКТИРОВАТЬ:
Еще один менее эффективныйальтернатива - Я НЕ РЕКОМЕНДУЮ! - это вызов .ToList()
для ваших данных до .Last()
, который немедленно выполнит выражение LINQ To Entities, которое было построено до этого момента, а затем ваш.Last () будет работать, потому что в этот момент .Last()
эффективно выполняется в контексте выражения LINQ to Objects .(И, как вы указали, это может привести к тысячам записей и бесполезной загрузке материализационных объектов ЦП, которые никогда не будут использоваться)
Опять же, я бы не советовал делать эту секунду, но это помогает проиллюстрировать разницумежду где и когда выполняется выражение LINQ.