【问题标题】:This overload of the method 'System.Linq.Queryable.TakeLast' is currently not supported当前不支持方法“System.Linq.Queryable.TakeLast”的这种重载
【发布时间】:2019-06-28 22:31:16
【问题描述】:

我有一个使用 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的限制吗?还是柚子?有什么解决方法吗?

谢谢

【问题讨论】:

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


    【解决方案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();
    

    为了达到同样的效果。

    【讨论】:

    • 完美!使用循环缓冲区和类似的疯狂东西比一些可枚举的实现要好得多。
    • 就非常大的结果集(例如 8000 万)而言,这对性能有何影响?我从来没有清楚地了解这一点。
    • 一次提取 8000 万条记录无论如何都不会高效。但是,如果您订购的列被索引,性能将尽可能好。
    猜你喜欢
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 2021-03-27
    • 2013-04-12
    相关资源
    最近更新 更多