EF Core 3.0 中的存储过程
Stored Procedures in 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();
EF 核心以错误的方式翻译 SQL。我从日志文件中得到了翻译后的 SQL。
2019-09-27 11:21:36.086 +05:30 [Error] Failed executing DbCommand
("30"ms) [Parameters=[""], CommandType='Text', CommandTimeout='30']"
""SELECT TOP(1) [u].[FullName], [u].[Password], [u].[UserName] FROM (
EXECUTE dbo.spGeneral_Authenticate ) AS [u]" 2019-09-27 11:21:36.154 +05:30 [Error] An exception occurred while iterating over
the results of a query for context type '"__________Context"'."
""Microsoft.Data.SqlClient.SqlException (0x80131904): Incorrect syntax
near the keyword 'EXECUTE'. Incorrect syntax near ')'.
已翻译 SQL:
SELECT TOP(1) [u].[FullName], [u].[Password], [u].[UserName]
FROM (
EXECUTE dbo.spGeneral_Authenticate
) AS [u]
Microsoft.Data.SqlClient.SqlException (0x80131904): Incorrect syntax
near the keyword 'EXECUTE'. Incorrect syntax near ')'.
对于上述错误,我们应该使用 .ToList() 或 .ToListAsync() 而不是 .FirstOrDefault() 或 .FirstOrDefaultAsync()
它会起作用
var user = await _context.Set<User>().FromSql("EXECUTE dbo.spTest").ToListAsync();
不行
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]
*/
已接受的答案是正确的。然而,这是我的两分钱:
此外,如果您只想获得一个结果,但仍希望异步调用服务器:
var user = (await _context.Set<User>().FromSql("EXECUTE dbo.spTest").ToListAsync()).FirstOrDefault();
如何在 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();
EF 核心以错误的方式翻译 SQL。我从日志文件中得到了翻译后的 SQL。
2019-09-27 11:21:36.086 +05:30 [Error] Failed executing DbCommand ("30"ms) [Parameters=[""], CommandType='Text', CommandTimeout='30']" ""SELECT TOP(1) [u].[FullName], [u].[Password], [u].[UserName] FROM ( EXECUTE dbo.spGeneral_Authenticate ) AS [u]" 2019-09-27 11:21:36.154 +05:30 [Error] An exception occurred while iterating over the results of a query for context type '"__________Context"'." ""Microsoft.Data.SqlClient.SqlException (0x80131904): Incorrect syntax near the keyword 'EXECUTE'. Incorrect syntax near ')'.
已翻译 SQL:
SELECT TOP(1) [u].[FullName], [u].[Password], [u].[UserName]
FROM (
EXECUTE dbo.spGeneral_Authenticate
) AS [u]
Microsoft.Data.SqlClient.SqlException (0x80131904): Incorrect syntax near the keyword 'EXECUTE'. Incorrect syntax near ')'.
对于上述错误,我们应该使用 .ToList() 或 .ToListAsync() 而不是 .FirstOrDefault() 或 .FirstOrDefaultAsync()
它会起作用
var user = await _context.Set<User>().FromSql("EXECUTE dbo.spTest").ToListAsync();
不行
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]
*/
已接受的答案是正确的。然而,这是我的两分钱:
此外,如果您只想获得一个结果,但仍希望异步调用服务器:
var user = (await _context.Set<User>().FromSql("EXECUTE dbo.spTest").ToListAsync()).FirstOrDefault();