【问题标题】:Stored Procedures in EF Core 3.0EF Core 3.0 中的存储过程
【发布时间】:2019-09-27 06:02:22
【问题描述】:

如何在 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='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] 迭代时发生异常 上下文类型 '"__________Context"' 的查询结果。 ""Microsoft.Data.SqlClient.SqlException (0x80131904): 语法不正确 在关键字“执行”附近。 ')' 附近的语法不正确。

翻译后的 SQL:

SELECT TOP(1) [u].[FullName], [u].[Password], [u].[UserName]
FROM (
    EXECUTE dbo.spGeneral_Authenticate
) AS [u]

【问题讨论】:

    标签: .net-core-3.0 ef-core-3.0


    【解决方案1】:

    Microsoft.Data.SqlClient.SqlException (0x80131904):语法不正确 在关键字“执行”附近。 ')' 附近的语法不正确。

    对于上述错误,我们应该使用 .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]
    */
    

    【讨论】:

    • 你找到用原始sql只获取一个对象的方法了吗?
    • @Kiran Shahi, .ToList().FirstOrDefault()
    • ToList 或 ToListAsync 不是解决方案,它给出了同样的错误。这并不奇怪,因为它没有理由表现不同。在我这边,实际运行的是以下内容: SELECT [u].[FullName], [u].[Password], [u].[UserName] FROM ( EXECUTE dbo.spTest ) AS [u] 所以...完全相同的pb
    • @Stephane,它按预期工作,检查小提琴dotnetfiddle.net/XudenD
    【解决方案2】:

    接受的答案是肯定的。然而,这是我的两分钱:

    另外,如果你只想得到一个结果并且仍然想让服务器异步调用:

    var user = (await _context.Set<User>().FromSql("EXECUTE dbo.spTest").ToListAsync()).FirstOrDefault();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-07
      • 2021-10-13
      • 1970-01-01
      相关资源
      最近更新 更多