此方法的重载';System.Linq.Queryable.TakeLast';当前不支持
我有一个使用实体框架核心的ASP.NETCore2.2WebAPI。 它使用最新版本的Pomelo连接到MySQL数据库。 当我尝试执行Linq函数“TakeLast”时,如下所示:此方法的重载';System.Linq.Queryable.TakeLast';当前不支持,linq,asp.net-core,entity-framework-core,Linq,Asp.net Core,Entity Framework Core,我有一个使用实体框架核心的ASP.NETCore2.2WebAPI。 它使用最新版本的Pomelo连接到MySQL数据库。 当我尝试执行Linq函数“TakeLast”时,如下所示: var messages = dbContext.Messages .TakeLast(5) .ToList(); 我得到这个错误: 引发异常:Remotion.Linq.dll中的“System.NotSupportedExceptio
var messages = dbContext.Messages
.TakeLast(5)
.ToList();
我得到这个错误:
引发异常:Remotion.Linq.dll中的“System.NotSupportedException”
System.NotSupportedException:无法分析表达式值(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[PropWorx.API.Models.Message])。TakeLast(u p_0):“System.Linq.Queryable.TakeLast”方法的此重载当前不受支持
Ling函数“Take”起作用,但“TakeLast”不起作用。这是MySql的一个限制吗?还是柚子?有解决办法吗
谢谢每个提供商都负责实现适用于其特定平台的LINQ表达式翻译。是的,Pomelo似乎没有为TakeLast提供支持 就解决办法而言,有两件事。首先,在没有ORDERBY子句的情况下,绝不能使用
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();
达到同样的效果。完美!与一些可枚举实现相比,循环缓冲区和类似的疯狂东西的性能要好得多。对于非常大的结果集(比如8000万个结果集),这里的性能影响是什么?我从来没有一个清晰的概述。一次拉8000万张唱片是不会有任何效果的,不管怎样。但是,如果您订购的列被索引,性能将尽可能好。