【问题标题】:EntityFrameworkCore 2.2 and MySql query could not be translated and will be evaluated locallyEntityFrameworkCore 2.2 和 MySql 查询无法翻译,将在本地评估
【发布时间】:2020-12-27 20:17:48
【问题描述】:

我正在尝试将使用 .net core sdk 2.2 构建的独立应用程序发布到 ubuntu 18.04-x64。该应用程序通过 Pomelo.EntityFrameworkCore.MySql 连接到 MySQL,并且通常运行良好,但我注意到 EntityFrameworkCore 构建 SQL 查询的方式有所不同。在我的开发机器上,下面的代码

        var parameters = new object[]
        {
            new MySqlParameter("count", count)
        };

        return _dbContext.Posts
            .OrderByDescending(x => x.DateCreated)
            .Select(x => new SuggestionsViewModel()
            {
                Id = x.Id,
                Title = x.Title

            }).FromSql(Sql.GetSuggestions, parameters);

翻译成查询

[INF] Executed DbCommand (0ms) [Parameters=[count='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT `x`.`Title`, `x`.`DateCreated`, `x`.`Id` 
FROM ( SELECT
            x.Id,
            x.Title,
            x.DateCreated 
        FROM
            Posts x
        WHERE    
            x.Picked = 1
        ORDER BY
            rand()
        LIMIT
            @count ) AS `x` ORDER BY `x`.`DateCreated` DESC

括号中的查询是常量 Sql.GetSuggestions。在生产中,只有内部查询被发送到数据库,并且在 sql 日志行之前会出现警告:

[INF] Entity Framework Core 2.2.6-servicing-10079 initialized 'ApplicationDbContext' using provider 'Pomelo.EntityFrameworkCore.MySql' with options: None
[WRN] The LINQ expression 'orderby [x].DateCreated desc' could not be translated and will be evaluated locally.
[INF] Executed DbCommand (1ms) [Parameters=[count='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
    SELECT
        x.Id,
        x.Title,
        x.DateCreated 
    FROM
        Posts x
    WHERE    
        x.Picked = 1
    ORDER BY
        rand()
    LIMIT
        @count

应用程序是使用以下命令构建和发布的:

dotnet build --configuration Release --runtime "ubuntu.18.04-x64" --force
dotnet publish --configuration Release --self-contained true --runtime "ubuntu.18.04-x64"

使用 2.2.110 .net core sdk

现在有些奇怪:当我将存储库拉到 ubuntu 并使用相同的 SDK 和相同的命令在服务器上构建时,查询构造符合预期。我的开发机器是带有IDE Visual Studio 2017的Win10Enterprise。

我做错了什么?

【问题讨论】:

    标签: mysql .net-core entity-framework-core ubuntu-18.04 pomelo-entityframeworkcore-mysql


    【解决方案1】:

    我能够通过您提供的步骤重现该问题。这可能是 EF Core 2.2 问题。


    无论是在 .NET Core 3.1 还是 2.2 下运行,它都能与 EF Core 3.1.7 和 Pomelo 3.1.2 完美配合。


    因此,您应该强烈考虑将 Pomelo 和 EF Core 升级到 3.1.x。两者都兼容 .NET Standard 2.0,这意味着它们也兼容 .NET Core 2.2。有关我们的兼容性矩阵,请参阅Compatibility: Dependencies

    我无法升级:Microsoft.AspNetCore.App 2.2 需要 EF Core 2.2

    可以将 EF Core 3.1 与 ASP.NET Core 2.2 结合使用。 看看我在another answer的开头。

    基本上,Microsoft.AspNetCore.App 包只是一个元包,它引用了很多不同的包,所以你不必自己做。但是,没有人会阻止您手动引用实际的包,或者只是用您想要的包覆盖Microsoft.AspNetCore.App 引用的默认包版本。链接答案的第一部分证明了这一点。

    【讨论】:

    • Windows 上 dotnet build&publish 生成的二进制文件与 ubuntu 上 build&publish 生成的二进制文件相同。如果我只覆盖现场的 project.dll,则会出现不同的行为。我无法升级:Microsoft.AspNetCore.App 2.2 需要 EF Core 2.2
    • 关于 ASP.NET 2.2 和 EF Core 3.1,请看我在another answer 的开头。基本上,Microsoft.AspNetCore.App 包只是一个元包,它引用了很多不同的包,所以你不必自己做。但是,没有人会阻止您手动引用实际的包,或者只是用您想要的包覆盖Microsoft.AspNetCore.App 引用的包版本。答案(部分)证明了这一点。
    • 至于实际问题,我会尽量重现。
    • 我能够重现该问题。
    • 感谢您的回答和您的调查时间。我已决定推进版本并升级并将 .net core sdk 迁移到 3.1。
    猜你喜欢
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    相关资源
    最近更新 更多