使用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
相关产品推荐
相关产品推荐

