如何在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 [错误]执行DbCommand失败 (“ 30” ms)[Parameters = [“”],CommandType ='文本',CommandTimeout = '30']“ “” SELECT TOP(1)[u]。[全名],[u]。[密码],[u]。[用户名] FROM( 执行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]
答案 0 :(得分:4)
被接受的答案很重要。但是,这是我的两分钱。
此外,如果您只想获得一个结果,但仍然希望异步进行服务器调用:
myProcess
答案 1 :(得分:0)
Microsoft.Data.SqlClient.SqlException(0x80131904):不正确的语法 关键字“ EXECUTE”附近。 ')'附近的语法不正确。
对于上述错误,我们应该使用.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]
*/