Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在实体框架核心中参数化连接字符串查询_C#_Sql_Asp.net Core_Entity Framework Core - Fatal编程技术网

C# 如何在实体框架核心中参数化连接字符串查询

C# 如何在实体框架核心中参数化连接字符串查询,c#,sql,asp.net-core,entity-framework-core,C#,Sql,Asp.net Core,Entity Framework Core,在Entity Framework Core中,我可以参数化SQL查询,如下所示: _context.Database.ExecuteSqlCommandAsync($"select * from table where id = {myid}"); 其中SQL查询字符串是FormattableString 我需要一次运行大约100行的SQL更新,当我使用Linq时,这会对数据库进行100次调用,而我可以很容易地使用SQL语句(如 UPDATE entity SET column = CAS

在Entity Framework Core中,我可以参数化SQL查询,如下所示:

_context.Database.ExecuteSqlCommandAsync($"select * from table where id = {myid}");
其中SQL查询字符串是FormattableString

我需要一次运行大约100行的SQL更新,当我使用Linq时,这会对数据库进行100次调用,而我可以很容易地使用SQL语句(如

UPDATE entity 
SET column = CASE .....
在一个电话里。但我不确定如何对串联字符串执行此操作

例如:

string sqlQuery = "UPDATE entity SET column = CASE " 

for(int i = 0; i < 10; i++){
    sqlQuery += "WHEN column2 = i THEN i + 1 ";
}

sqlQuery += "WHERE id IN (1,2,3,4,5,6,7,8,9,10)";

await _context.Database.ExecuteSqlCommandAsync(sqlQuery);
如何清理或参数化此查询?任何帮助都将不胜感激

您的第一个示例是一种不好的参数化查询的方法,因为它为SQL注入打开了大门:C中的插值字符串功能不是专门为SQL命令设置的;它有多种用途,因此不实现SQL清理

应始终使用SqlCommand类及其Parameters属性,以确保正确清理参数:

更新:当在EF Core中使用该特定构造函数时,插值字符串被隐式地视为SQL命令,而Interpoland被清除

但是,在这种情况下,您需要使用@parameter表示法构建字符串,然后使用SqlCommand替换参数,以确保这些参数已清理干净,因为您不能将查询表示为单个模板文本


此外,如果您确实需要连接大量字符串,+=是一种非常低效的方法,您应该使用StringBuilder来提高速度。

谢谢。我可以向您保证代码_context.Database.ExecuteSqlCommandAsync$select*来自id={myid}的表;是安全的,可能不是最佳实践,但它是一个FormattableString类而不是普通字符串,因此由实体框架参数化。问题实际上在于连接-当我连接时,如我的示例所示,我不能再将其作为FormattableString传递给ExecuteSQLCommandAsync方法。您对如何实现这一点有什么建议吗?使用StringBuilder创建字符串以提高性能,而不是直接在{I}中替换{I+1}替换为@I_0之类的内容。然后从字符串创建一个SqlCommand并运行一个循环,该循环添加参数以替换参数化查询中的每个值。看起来您缺少了EF Core标记。第一个示例对于EF Core SQL命令非常有效,因为EF Core特别处理插值字符串,并为每个占位符绑定参数。这是一种非常隐蔽的隐式行为。在EF的早期版本中意外使用它似乎是一个容易陷入的陷阱。谢谢,但我不确定如何在仍然能够参数化字符串的同时连接字符串,因为FormattableString类不支持连接,除非我进行一些反射。。。有办法吗?