目前不支持“System.Linq.Queryable.TakeLast”方法的这种重载

Fab*_*uez 4 linq entity-framework-core asp.net-core

我有一个使用 Entity Framework Core 的 ASP .Net Core 2.2 Web API。它使用最新版本的 Pomelo 连接到 MySQL 数据库。当我尝试执行 Linq 函数“TakeLast”时,如下所示:

var messages = dbContext.Messages
                   .TakeLast(5)
                   .ToList();
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

抛出异常:Remotion.Linq.dll 中的“System.NotSupportedException”

System.NotSupportedException:无法解析表达式“值(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[PropWorx.API.Models.Message])。TakeLast(__p_0)”:方法“System.Linq.Queryable”的重载目前不支持“.TakeLast”。

Ling 功能“Take”有效,但“TakeLast”无效。这是MySql的限制吗?还是柚子?有什么解决办法吗?

谢谢

Chr*_*att 6

每个提供商负责实现适用于其特定平台的 LINQ 表达式翻译。是的,Pomelo 似乎没有提供对TakeLast.

就解决方法而言,有两件事。首先,不应该在没有 order by 子句的情况下使用Skip/ 。Take默认顺序将是主键,但根据键的类型,最终可能几乎完全是随机的。明确顺序总是更好,这样您就可以准确理解从结果中获取的内容。

其次,假设您有一个顺序,要获得TakeLast功能,您只需颠倒顺序并使用Take即可。例如,假设您按创建日期提取消息:

var messages = dbContext.Messages.OrderBy(o => o.Created).TakeLast(5).ToList();
Run Code Online (Sandbox Code Playgroud)

你在这里真正想说的是,你想要那些具有最新创建日期的,所以你可以这样做:

var messages = dbContext.Messages.OrderByDescending(o => o.Created).Take(5).ToList();
Run Code Online (Sandbox Code Playgroud)

达到同样的结果。