EntityFrameworkCore 2.2和MySql查询无法翻译,将在本地进行评估

问题描述

我正在尝试将使用.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)],CommandTimeout='30']
    SELECT
        x.Id,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核心SDK

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

我在做什么错了?

解决方法

我能够按照您提供的步骤重现该问题。这可能是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包只是一个meta包,它引用了许多不同的包,因此您不必自己执行此操作。但是,没有人阻止您手动引用实际的软件包,或者只是将Microsoft.AspNetCore.App引用的默认软件包版本替换为所需的软件包版本。链接答案的第一部分对此进行了演示。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...