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 编译时错误在查询中访问 DbSet
s,因为它们同时实现了 IQueryable<T>
和 IAsyncEnumerable<T>
.
所以你最好继续使用第一个解决方案,直到这个问题得到解决(我认为它会在 EF Core 6 中)。
我正在使用 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 编译时错误在查询中访问 DbSet
s,因为它们同时实现了 IQueryable<T>
和 IAsyncEnumerable<T>
.
所以你最好继续使用第一个解决方案,直到这个问题得到解决(我认为它会在 EF Core 6 中)。