目前不支持方法'System.Linq.Queryable.TakeLast'的重载

时间:2019-06-28 14:23:59

标签: linq asp.net-core entity-framework-core

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

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

我收到此错误:

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

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

Ling函数“ Take”有效-但“ TakeLast”无效。这是MySql的限制吗?还是柚子?有解决方法吗?

谢谢

1 个答案:

答案 0 :(得分:1)

每个提供商都负责实现适用于其特定平台的LINQ表达式转换。是的,看来Pomelo没有为TakeLast提供支持。

就变通办法而言,有两件事。首先,在没有order by子句的情况下,切勿使用Skip / Take。默认顺序将是主键,但是根据键的类型,最终可能几乎完全是随机的。最好对顺序进行明确说明,这样您就可以准确地了解 从结果中获取的内容。

第二,假设您已订购,则要获得TakeLast功能,您只需要颠倒顺序并使用Take。例如,假设您要按创建日期提取消息:

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

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

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

要获得相同的结果。