Эта перегрузка метода System.Linq.Queryable.TakeLast в настоящее время не поддерживается - PullRequest
0 голосов
/ 28 июня 2019

У меня есть ASP .Net Core 2.2 Web API, использующий Entity Framework Core. Он подключается к базе данных MySQL, используя последнюю версию Pomelo. Когда я пытаюсь выполнить функцию Linq "TakeLast", например:

var messages = dbContext.Messages
                   .TakeLast(5)
                   .ToList();

Я получаю эту ошибку:

Возникло исключение: 'System.NotSupportedException' в Remotion.Linq.dll

System.NotSupportedException: Не удалось проанализировать значение выражения (Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1 [PropWorx.API.Models.Message]). TakeLast (__ p_0) ': эта перегрузка метода' System. Linq.Queryable.TakeLast 'в настоящее время не поддерживается.

Функция Ling "Take" работает, а "TakeLast" - нет. Это ограничение MySql? Или помело? Есть обходной путь?

Спасибо

1 Ответ

1 голос
/ 28 июня 2019

Каждый поставщик отвечает за реализацию перевода выражений LINQ, который работает для их конкретной платформы. Похоже, да, что Pomelo не предоставил поддержку TakeLast.

Что касается обходных путей, две вещи. Во-первых, вы никогда не должны использовать Skip / Take без предложения order by. Порядок по умолчанию будет первичным ключом, но в зависимости от типа ключа он может оказаться почти полностью случайным. Всегда лучше четко указать порядок, чтобы вы точно поняли , что берется из результатов.

Во-вторых, если у вас есть порядок, чтобы получить функциональность TakeLast, вам просто нужно отменить порядок и использовать вместо него Take. Например, предположим, что вы извлекаете сообщения по дате создания:

var messages = dbContext.Messages.OrderBy(o => o.Created).TakeLast(5).ToList();

Что вы на самом деле говорите, так это то, что вам нужны те, которые имеют самую последнюю дату создания, так что вы можете сделать вместо этого:

var messages = dbContext.Messages.OrderByDescending(o => o.Created).Take(5).ToList();

Для достижения того же результата.

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