EF Core FromSqlRaw 不执行存储过程

EF Core FromSqlRaw not executing stored procedure

我正在使用 EF Core 版本 3.1.9。

此处显示的代码是执行存储过程 - 但它似乎不起作用:

var test1 = "abc";
var test2 = "xyz";

EmpResponse emp = await _context.Emp
                                .FromSqlRaw("EXECUTE EMPS..sel_keys @param1 = 20000, @param2 = {0}, @param3 = {1}", test1, test2)
                                .FirstOrDefaultAsync();

我收到这个错误:

FromSqlRaw or FromSqlInterpolated was called with non-composable SQL and with a query composing over it.

Consider calling AsEnumerable after the FromSqlRaw or FromSqlInterpolated method to perform the composition on the client side.

我找到了下面的文档,建议使用AsEnumerable().FirstOrDefault()

修改

https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.x/breaking-changes#fromsql

但是由于我使用的是await,所以上面的建议是行不通的。 有人可以建议如何使用 await 吗?

最简单的是 await 调用 ToListAsync() 然后应用 {First|Single|Last}{OrDefault},例如

var emp = (await _context.Emp
    .FromSqlRaw("EXECUTE EMPS..sel_keys @param1 = 20000, @param2 = {0}, @param3 = {1}", test1, test2)
    .ToListAsync())
    .FirstOrDefault();

通常他们(EF Core 设计者)希望您只插入 AsAsyncEnumerable()

var emp = await _context.Emp
    .FromSqlRaw("EXECUTE EMPS..sel_keys @param1 = 20000, @param2 = {0}, @param3 = {1}", test1, test2)
    .AsAsyncEnumerable() // <--
    .FirstOrDefaultAsync();

但是首先需要安装额外的 System.Linq.Async 包,其次 - 一旦你这样做了,你就会开始收到很多 ambiguous call 编译时错误在查询中访问 DbSets,因为它们同时实现了 IQueryable<T>IAsyncEnumerable<T>.

所以你最好继续使用第一个解决方案,直到这个问题得到解决(我认为它会在 EF Core 6 中)。