EF Core调用存储过程获取单个用户时出现SQL不可组合错误咨询
解决EF Core调用存储过程时的"不可组合SQL"错误
你的代码里调用存储过程后直接使用FirstOrDefault(),EF Core会尝试将这个操作转换为SQL语句和存储过程执行进行组合,但存储过程的SQL是不可组合的,因此触发了错误。
解决方案:先将查询转为客户端枚举,再执行筛选操作
在FromSqlInterpolated()之后调用AsEnumerable(),让后续的FirstOrDefault()在客户端内存中执行,而非尝试生成组合SQL:
public myObject GetUser(int ID) { FormattableString inputString = $"EXEC [dbo].[sp_GetSingleUser] @ID={ID}"; // 先转为客户端枚举,再取第一条数据 var myUser = _context.EditSelectedUsers.FromSqlInterpolated(inputString) .AsEnumerable() .FirstOrDefault()!; return myUser; }
额外优化点
- 无需手动创建
SqlParameter:FromSqlInterpolated会自动处理参数化,直接传入ID即可,既简洁又能防止SQL注入。 - 可以去掉初始化空
SingleUser的代码,直接用查询结果赋值更高效。
错误原因补充
EF Core的FromSql/FromSqlInterpolated对于存储过程这类不可组合的SQL,无法将后续的LINQ查询(如FirstOrDefault、Where等)转换为SQL语句拼接执行,必须通过AsEnumerable()或ToList()先将数据加载到客户端内存,再执行后续操作。
内容的提问来源于stack exchange,提问作者BigSargeNCharge
相关产品推荐
相关产品推荐

