我有一个使用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的限制吗?还是柚子?有解决方法吗?
谢谢
答案 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();
要获得相同的结果。