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

使用EF Core SQLite扩展时CreateCommand正常但SqlQueryRaw失效问题

问题分析与修复

你的SqlQueryRaw代码存在两处关键错误,导致无法正常运行:

错误1:调用参数完全错误

你在调用SqlQueryRaw时,重复传入了完整的SQL语句,并且给表名参数多套了一层大括号,直接触发语法错误。SqlQueryRaw的正确用法是:第一个参数是带占位符的SQL模板,后续参数仅对应占位符的取值,不需要重复写SQL,也不需要给参数加额外大括号。

错误2:表名无法通过参数化占位符传递

SQLite和多数数据库一样,不支持对表名、列名这类对象名称进行参数化。SqlQueryRaw会把{0}解析成值参数,导致最终SQL里的表名被当成字符串常量,而非实际表名,触发SQL语法错误。

修复后的代码

由于表名无法参数化,你可以直接采用和CreateCommand一致的字符串拼接方式(表名来自EF Core模型,不存在SQL注入风险),修复后的代码如下:

using (var db = new DBConnection())
{
    foreach (var table in db.Model.GetEntityTypes())
    {
        var tableName = table.Name.Split(".").Last();
        // 直接拼接表名到SQL语句中
        var query = db.Database.SqlQueryRaw<int>($"SELECT COUNT(*) FROM {tableName}");

        var count = query.Single();

        Console.WriteLine(count);
    }
}

如果你偏好插值写法,也可以用SqlInterpolated,它会自动处理插值逻辑,效果和上述代码一致:

using (var db = new DBConnection())
{
    foreach (var table in db.Model.GetEntityTypes())
    {
        var tableName = table.Name.Split(".").Last();
        var query = db.Database.SqlInterpolated<int>($"SELECT COUNT(*) FROM {tableName}");

        var count = query.Single();

        Console.WriteLine(count);
    }
}

原CreateCommand能运行的原因

你在CreateCommand中直接将表名拼接进了SQL语句,没有尝试参数化表名,完全符合SQLite的语法要求,因此可以正常执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 00:15:33