我在 ASP.NET Core 项目中使用 EF Core 7。当它是实际的 SQL 查询时,EF Core 的
FromSql
方法认为提供的参数是存储过程的名称。如何让它运行选择查询并检索结果?
根据 EF Core 文档,我需要使用
FromSql
或 FromSqlInterpolated
方法通过原始 SQL 输入执行 SELECT
操作。但是,当我使用 FromSql
时,我收到错误:
Microsoft.Data.SqlClient.SqlException 找不到存储过程“SELECT * FROM dbo.Country”
这个简单的测试查询 (
SELECT * FROM dbo.Country
) 当我在 SSMS 中运行时运行良好。然而,由于某种原因,EF Core 认为这是存储过程的名称,并尝试查找存储过程,这显然失败了。
我尝试查看
FromSql
方法是否具有重载,用于指定字符串参数是实际查询还是存储过程的名称,但这似乎不可能。看起来该方法只接受单个字符串参数,并以某种方式在内部决定所提供的参数是存储过程还是查询。
在文档页面上,很明显
FromSql
能够将实际查询作为输入。
这是我收到错误的代码(参数是
SELECT * FROM dbo.Country
):
public async Task<List<T>> RunRawSql(string query)
{
try
{
var a = _context.Set<T>().FromSql($"{query}");
return a.ToList();
}
catch (Exception ex)
{
return null;
}
}
问题是
FromSql
方法不允许参数化实际的数据库模式(表名、列名等)。就我而言,我将查询作为一个整体,它属于参数化数据库模式的类别,因此 FromSql
不起作用。显然,如果您需要参数化模式,则必须使用 FromSqlRaw
来代替。
请注意,
FromSqlRaw
容易受到SQL注入攻击,因此您应该尽可能使用FromSql
或FromSqlInterpolated
。您必须注意切勿将任何用户输入发送到此处。不过,只要将此方法与任何用户输入完全解耦,使用FromSqlRaw
就可以了。