我很困惑 !
我有一个 ASP.Net Core 3 WebApi 应用程序,它工作正常:
var results = _context.Users.ToList();
但是,如果我尝试HINT在 SQL 中添加“”...
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,所以我按照这篇 Microsoft 文章DbCommandInterceptor中的说明在我的查询中添加了一个。
在他们的示例中,它拦截 SQL 并附" OPTION (ROBUST PLAN)"加到字符串。它表明它正在尝试运行此 SQL:
SELECT [u].[user_id], [u].[user_name]
FROM t_user
OPTION (ROBUST PLAN)
如果我以 Microsoft 为例,并将其更改为使用我的提示,那么我仍然会收到相同的错误,即“数据库‘提示’不存在。 ”
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'))";
}
}
啊啊啊!为什么我不能使用提示?!