EF Core 3.0中的存储过程

时间:2019-09-27 06:02:22

标签: .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();

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]

2 个答案:

答案 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]
*/