You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

额外优化点

  1. 无需手动创建SqlParameter:FromSqlInterpolated会自动处理参数化,直接传入ID即可,既简洁又能防止SQL注入。
  2. 可以去掉初始化空SingleUser的代码,直接用查询结果赋值更高效。

错误原因补充

EF Core的FromSql/FromSqlInterpolated对于存储过程这类不可组合的SQL,无法将后续的LINQ查询(如FirstOrDefault、Where等)转换为SQL语句拼接执行,必须通过AsEnumerable()或ToList()先将数据加载到客户端内存,再执行后续操作。

内容的提问来源于stack exchange,提问作者BigSargeNCharge

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 20:02:28