【发布时间】:2021-02-23 23:21:43
【问题描述】:
我很困惑!
我有一个 ASP.Net Core 3 WebApi 应用程序,它运行良好:
var results = _context.Users.ToList();
但是,如果我尝试在 SQL 中添加“HINT”...
var results = _context.Users.FromSqlRaw("SELECT * FROM t_user OPTION(USE HINT('ENABLE_PARALLEL_PLAN_PREFERENCE'))").ToList();
...然后它抛出这个异常...
Incorrect syntax near the keyword 'OPTION'.
Database 'HINT' does not exist. Make sure that the name is entered correctly.
为什么这个 SQL 会在 SQL Server Management Studio 中成功运行,却被 WebApi 误解了?
更新 #1
该死的。当您告诉 EF Core 使用 Raw SQL 时,它实际上将该 SQL 放入子句中,这就是我看到错误的原因。
所以,这是我正在尝试运行的(完全有效的)SQL:
SELECT * FROM t_user
OPTION(USE HINT('ENABLE_PARALLEL_PLAN_PREFERENCE'))
..但是,查看 SQL Server Profiler,EF Core 实际上正在尝试此 SQL,这是无效的...
SELECT [u].[user_id], [u].[user_name]
FROM (
SELECT * FROM t_user
OPTION(USE HINT('ENABLE_PARALLEL_PLAN_PREFERENCE'))
) AS [u]
该死的……
那么我们如何使用来自 EF Core 的提示?
更新 #2
因为我使用的是 EF Core,所以我按照this Microsoft article 中的说明将DbCommandInterceptor 添加到我的查询中。
在他们的示例中,它拦截 SQL 并将 " OPTION (ROBUST PLAN)" 附加到字符串。它表明它正在尝试运行此 SQL:
SELECT [u].[user_id], [u].[user_name]
FROM t_user
OPTION (ROBUST PLAN)
如果我以 Microsoft 为例,并将其更改为使用 my HINT,那么我仍然会收到相同的错误,即“Database 'HINT' 不存在。"
private static void ManipulateCommand(DbCommand command)
{
if (command.CommandText.StartsWith("-- Use hint: robust plan", StringComparison.Ordinal))
{
command.CommandText += " OPTION(USE HINT('ENABLE_PARALLEL_PLAN_PREFERENCE'))";
}
}
啊啊啊!为什么我不能使用提示?!
【问题讨论】:
-
您确定它与您在 SSMS 中使用的 SQL Server 版本和兼容性级别相同吗?这不是 EF 错误,这是直接来自 SQL Server
-
感谢@Charlieface,这是一个很好的提示...并指出了我正确的方向!
-
什么版本的 EF?我在 EF Core 5 或 3.1 中看不到这种行为,除非我在
FromSqlRaw之后编写其他查询运算符。 -
我使用的是 EF Core v3.1.4。我的项目是.Net Core 3.1。而且,我试图去掉任何额外的操作符,但仍然有这个问题。
标签: sql sql-server asp.net-core-webapi