EF Core 3.0 中的存储过程

Pal*_*mar 6 .net-core-3.0 ef-core-3.0

如何在 EF Core 3.0 中使用存储过程?

我已经尝试了以下

var user = await _context.Query<User>().FromSql("EXECUTE dbo.spGeneral_Authenticate").FirstOrDefaultAsync();

var user = await _context.Query<User>().FromSqlRaw("EXECUTE dbo.spGeneral_Authenticate").FirstOrDefaultAsync();

var user = await _context.Set<User>().FromSql("EXECUTE dbo.spGeneral_Authenticate").FirstOrDefaultAsync();

var user = await _context.Set<User>().FromSqlRaw("EXECUTE dbo.spGeneral_Authenticate").FirstOrDefaultAsync();
Run Code Online (Sandbox Code Playgroud)

EF 核心以错误的方式翻译 SQL。我从日志文件中得到了翻译后的 SQL。

2019-09-27 11:21:36.086 +05:30 [错误] 执行 DbCommand 失败 ("30"ms) [Parameters=[""], CommandType='Text', CommandTimeout='30']" ""SELECT TOP(1) [u].[全名], [u].[密码], [u].[用户名] FROM ( EXECUTE dbo.spGeneral_Authenticate ) AS [u]" 2019-09-27 11:21:36.154 + 05:30 [错误] 迭代上下文类型“__________Context”的查询结果时发生异常。“”“Microsoft.Data.SqlClient.SqlException (0x80131904):关键字“EXECUTE”附近的语法不正确。不正确')' 附近的语法。

翻译后的 SQL:

SELECT TOP(1) [u].[FullName], [u].[Password], [u].[UserName]
FROM (
    EXECUTE dbo.spGeneral_Authenticate
) AS [u]
Run Code Online (Sandbox Code Playgroud)

Pal*_*mar 5

Microsoft.Data.SqlClient.SqlException (0x80131904): Incorrect syntax near the keyword 'EXECUTE'. Incorrect syntax near ')'.

For the above error, we should use .ToList() or .ToListAsync() not .FirstOrDefault() or .FirstOrDefaultAsync()

It will work

var user = await _context.Set<User>().FromSql("EXECUTE dbo.spTest").ToListAsync();
Run Code Online (Sandbox Code Playgroud)

It won't work

var user = await _context.Set<User>().FromSql("EXECUTE dbo.spTest").FirstOrDefaultAsync();
/*
Transalated SQL:
SELECT TOP(1) [u].[FullName], [u].[Password], [u].[UserName]
FROM (
    EXECUTE dbo.spTest
) AS [u]
*/
Run Code Online (Sandbox Code Playgroud)