我正在尝试将使用 .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。
我究竟做错了什么?